home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / TP051092.ARJ / 05-10-92.TPC
Text File  |  1992-05-10  |  114KB  |  3,548 lines

  1.  
  2. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3.  
  4. Conference 4
  5. Date       01-01-00 00:00:00
  6. From       
  7. To         
  8. Subject    
  9.  
  10.  
  11. --- WM v2.01/92-0100
  12.  * Origin: A.C.E. of Spades (615)383-4381 The B.A.N. board (1:116/33)
  13.  * Tossed by SFToss v1.00b on 92/04/09  12:01:00
  14.  
  15. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  16.  
  17. Conference 4
  18. Date       05-02-92 12:35:46
  19. From       Trevor Carlsen
  20. To         Matt Heck
  21. Subject    Borland, OS/2 2.0, and you
  22.  
  23.  
  24.  
  25.  MH> Is there any point to a 286 with 640k and a 40MB HDD running OS/2?
  26.  
  27. None at all, mainly because it will not run on a 286.  OS/2 2.0 is a 32 bit
  28. system specifically coded for 386/486 operation.
  29.  
  30.  MH>      And either way, are the rest of you planning to program for it, 
  31.  
  32.  MH> thereby attempting to force us to shell out more cash?
  33.  
  34. I'll wait and see.  However when TP is released for OS/2 then I will definitely
  35. buy it for a look.  If the demand is there, then there is no decision required.
  36.  
  37. TeeCee
  38.  
  39. --- TC-ED   v2.01  
  40.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  41.  * Tossed by SFToss v1.00b on 92/05/02  15:11:52
  42.  
  43. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  44.  
  45. Conference 4
  46. Date       05-02-92 12:45:29
  47. From       Trevor Carlsen
  48. To         John Gohde
  49. Subject    A Virtuous Pascal ...
  50.  
  51.  
  52.  
  53.  JG> POINT ONE: TP4 has more than enough features to keep a first time
  54.  JG> non-genius casual programmer busy for one year of devoted study.
  55.  
  56. Agree 100%.  Well put.
  57.  
  58.  JG> POINT TWO: There  is a market for a simple  and stable real world
  59.  JG> version  of   Pascal...
  60.  
  61. Agree 100% - again!
  62.  
  63.  JG> POINT THREE: Why pay for features and learn features that will be
  64.  JG> out of  date by the  time you  get  around to using  them for the
  65.  JG> first time?
  66.  JG> In other words, why pay for TV version 6 if you wont use TV until
  67.  JG> version 7 or 8 exists?
  68.  
  69. Three in a row!
  70.  
  71.  JG> POINT FOUR: There is a market segment who would buy TP4 at USA$40
  72.  JG> rather than  TP6 at USA$110, if  they had that option.  And, this
  73.  JG> alleged  FACT  has  nothing  whatsoever  to  do  with  Borland TP
  74.  JG> propaganda.
  75.  
  76. You been reading my mind?
  77.  
  78.  JG> POINT FIVE: The availability of a good, simple, and stable Pascal
  79.  JG> at  USA$40 would  ONLY tend  to promote  the use  of PASCAL  as a
  80.  JG> programming language; whereas the  current marketing practises of
  81.  JG> Borland  MAY not  have the  promotion of  Pascal as a programming
  82.  JG> language as a priority.
  83.  
  84. I hate to say this - but that's five.
  85.  
  86. You have just determined that there is a niche market that would almost certainl
  87.  be quite lucrative... Go for it.
  88.  
  89. (See?  when you stick to facts and objectivity you and I CAN agree :-)  )
  90.  
  91. TeeCee
  92.  
  93. --- TC-ED   v2.01  
  94.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  95.  * Tossed by SFToss v1.00b on 92/05/02  15:11:52
  96.  
  97. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  98.  
  99. Conference 4
  100. Date       05-02-92 17:21:47
  101. From       Trevor Carlsen
  102. To         Lee Cassar
  103. Subject    Need some help
  104.  
  105.  
  106.  
  107.  LC> I need some help.  I want to know how to turn on and off the locks on 
  108.  
  109.  LC> the keyboard(scroll, num, and caps) using a turbo pascal routine.
  110.  LC> Does anyone have any ideas?
  111.  LC> (I have turbo Pascal 6.0 Professional)
  112.  
  113. type
  114.   shiftstatus = set of (RightShift, LeftShift, Ctrl, Alt,
  115.                         ScrollLock, NumLock, CapsLock, InsertOn);
  116. var
  117.   KbdStatus   : shiftstatus absolute $40:$17;
  118.  
  119. Eg.  To turn caps lock on -
  120.  
  121. KbdStatus := KbdStatus + [CapsLock];
  122.  
  123.      To turn it off -
  124.  
  125. KbdStatus := KbdStatus - [CapsLock];
  126.  
  127. TeeCee
  128.  
  129.  
  130.  
  131. --- TC-ED   v2.01  
  132.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  133.  * Tossed by SFToss v1.00b on 92/05/02  15:11:52
  134.  
  135. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  136.  
  137. Conference 4
  138. Date       05-02-92 17:32:39
  139. From       Trevor Carlsen
  140. To         Greg Belanger
  141. Subject    Encryption of sorts..
  142.  
  143.  
  144.  
  145.  GB> I'm lookin for a way to Encrypt various aspects of my programs.  For 
  146.  
  147.  GB> example, I know it's quite easy to use a HEX editor and go in and edit 
  148.  
  149.  GB> the program name, autor and copyright info.  Is there a way to make 
  150.  GB> this "text" unmodifiable?  I'm looking for a nice, simple routine..not 
  151.  
  152.  GB> 400 lines of encryption code.  Any suggestions?
  153.  
  154. By far the easiest and safest way of doing what you want is to place all textual
  155. information used by your program in a file and encrypt that file.  Unencrypt
  156. it during the initialisation routine.
  157.  
  158. Doing it this way will also solve the problem that arises when self modifying
  159. files are used with things like foreign languages, overlays, PkLite etc. 
  160. Special foreign language editions are simply made just by providing a specific
  161. file for that language.
  162.  
  163. To create the file just create a typed file of string[80] and use record zero
  164. as a header in which you can store data such as random number generator seeds,
  165. passwords etc.  All this is very simple to do.  Here is a simple program to
  166. encrypt such a file and the function to place in the program to unencrypt
  167. the respective string.  It is by no means unbreakable but will certainly represe
  168. t more trouble to work out what you are doing than it is worth!
  169.  
  170. {$X+}
  171. program encrypt;
  172. uses crt;
  173. var f        : file of string[80];
  174.     txt      : text;
  175.     st       : sting[80];
  176.     key      : longint;
  177.     SavedKey : longint absolute st;
  178.  
  179. procedure EncryptStr(var st: string[80]);
  180.   var x : byte;
  181.   begin
  182.     for x := 1 to length(st) do
  183.       st[x] := char(st[x] xor random(256);
  184.   end;
  185.  
  186. begin
  187.   Randomize;
  188.   assign(f,'TheFile.cfg');
  189.   rewrite(f);
  190.   assign(txt,'RawText.txt');
  191.   reset(f);
  192.   writeln('Press any key to continue...');
  193.   repeat
  194.     key := key xor Random(MaxInt) * Random(MaxInt);
  195.   until Keypressed;
  196.   SavedKey := key;
  197.   RandSeed := key;
  198.   write(f,st);
  199.   repeat
  200.     ReadLn(txt,st);
  201.     EncryptStr(st);
  202.     write(f,st);
  203.   until eof(txt);
  204.   close(f);
  205.   close(txt);
  206. end.
  207.  
  208. Untested.
  209.  
  210. To unencrypt just read the first 4 bytes of the first record into a longint,
  211. use that longint as your RandomSeed and then use the above Encrypt procedure
  212. to unencrypt the string.
  213.  
  214. TeeCee
  215.  
  216. --- TC-ED   v2.01  
  217.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  218.  * Tossed by SFToss v1.00b on 92/05/02  15:11:52
  219.  
  220. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  221.  
  222. Conference 4
  223. Date       05-02-92 16:30:58
  224. From       Mark Ouellet
  225. To         Mike Wilson
  226. Subject    Re: DirectVideo:=? and DV
  227.  
  228.  
  229.     On 22 Apr 92, you, Mike Wilson, of 1:130/28.0 wrote...
  230.  
  231.  MW> I have some code that I run under DV and have noticed a small problem.  
  232.  
  233.  MW> If I have the mouse loaded (MicorSoft Mouse) and have 2 windows open 
  234.  
  235.  MW> (one running the metioned software) the video in the "other" window I am 
  236.  
  237.  MW> in when I press "Alt" acts funny.  By this I mean it acts as if the 
  238.  MW> mouse is connected to the output of the "Other" window... In other words 
  239.  
  240.  MW> it follows the text from the other window.  Now this happens with 
  241.  MW> "DirectVideo := False", but when I run without this I get bleed 
  242.  MW> throughs...
  243.  MW> 
  244.  MW> Any suggestions?
  245.  
  246. Mike,
  247.         If you are running on a 386 then DV-386 would solve
  248. the problem. With the ability the 386s have of remaping any
  249. memory region, DV uses that ability to remap the video
  250. memory used by the program when you tell it that this
  251. particular program writes directly to video memory.
  252.  
  253.         If you are specifically writing stuff for DV it also
  254. removes the problem of getting your video buffer adress from
  255. DV as long as you limit your programs to 386s and up.
  256. Anything else will have to be well behaved but if you only
  257. program for your own use then why bother if DV-386 can
  258. handle it.
  259.  
  260.         Best regards,
  261.         Mark Ouellet.
  262.  
  263.  
  264.  
  265. --- ME2
  266.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  267.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  268.  
  269. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  270.  
  271. Conference 4
  272. Date       05-02-92 16:41:49
  273. From       Mark Ouellet
  274. To         Dj Murdoch
  275. Subject    Re: Question, Compression
  276.  
  277.  
  278.     On 23 Apr 92, you, Dj Murdoch, of 1:221/177.40 wrote...
  279.  
  280.  EG>> I heard about someone working on an INTENSIVE form of 
  281.  EG>> compression, It would take almost a MEG and make it 1 
  282.  EG>> byte, does ANY one know about this radical compression 
  283.  EG>> theory?
  284.  
  285.  GW>> Hehehe... sounds like "lossey" compression to me!
  286.  
  287.  DM> Here's my new, super-duper lossless compression method that can compress 
  288.  
  289.  DM> huge files incredibly: for example, the file TURBO.EXE (325982 bytes) 
  290.  
  291.  DM> and the file TURBO.HLP (669951 bytes) can each be compressed into a 
  292.  DM> single *bit*!!!!!! 
  293.  DM> 
  294.  DM> (DOS doesn't handle 1 bit files well, so I write out the bit as a whole 
  295.  
  296.  DM> byte.  In fact, DOS will waste a whole cluster storing the compressed 
  297.  
  298.  DM> version, but that's not my fault.) 
  299.  DM> 
  300.  DM> Program Compress; 
  301.  DM> begin
  302.  DM> if paramstr(1) = 'TURBO.EXE' then
  303.  DM> write('0')
  304.  DM> else 
  305.  DM> write('1'); 
  306.  DM> end.
  307.  DM> 
  308.  DM> Unfortunately, the uncompress program is rather complicated; the best 
  309.  
  310.  DM> I've been able to do so far is a 1 megabyte uncompressor, which looks 
  311.  
  312.  DM> something like this:
  313.  DM> 
  314.  DM> Program UnCompress; 
  315.  DM> var
  316.  DM> bit : char; 
  317.  DM> begin
  318.  DM> read(bit);
  319.  DM> if bit = '0' then
  320.  DM> write_out_a_copy_of_turbo_exe
  321.  DM> else
  322.  DM> write_out_a_copy_of_turbo_hlp; 
  323.  DM> end.
  324.  DM> 
  325.  DM> I've left out the write_out_... routines, because they're rather dull.  
  326.  
  327.  DM> One limitation of this compressor:  it's only lossless on TURBO.EXE and 
  328.  
  329.  DM> TURBO.HLP; other files are lost completely.
  330.  DM> 
  331.  DM> :-) :-) :-)     <======= For TeeCee :-)
  332.  
  333. Dj,
  334.         I love it but could you make me a self extracting
  335. version ;-)
  336.  
  337.         Best regards,
  338.         Mark Ouellet.
  339.  
  340.  
  341.  
  342. --- ME2
  343.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  344.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  345.  
  346. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  347.  
  348. Conference 4
  349. Date       05-02-92 16:44:19
  350. From       Mark Ouellet
  351. To         KEVIN PARADINE
  352. Subject    Re: Multiuser databases
  353.  
  354.  
  355.     On 22 Apr 92, you, KEVIN PARADINE, of 1:107/480.0 wrote...
  356.  
  357.  KP> You're better off locking the whole database, rather than a record.  
  358.  
  359.  KP> Why?
  360.  KP> 
  361.  KP> Ok, let's say I have two files open: one is a set of message headers and 
  362.  
  363.  KP> the other is a set of blocks of text (for argument's sake).  Instance 1 
  364.  
  365.  KP> of my application is just attempting to edit message 2 in the header 
  366.  
  367.  KP> file, and is currently reading and locking text blocks.  Instance 2 of 
  368.  
  369.  KP> my application is deleting message 2.  Instance 2 has a text block from 
  370.  
  371.  KP> message 2 locked currently, and is marking it as deleted.  However, it 
  372.  
  373.  KP> will not release the lock until it can mark the header as deleted.  The 
  374.  
  375.  KP> header is locked by instance 1.  Instance 1 is trying to lock the text 
  376.  
  377.  KP> block that instance 2 has locked.  Share wars.  These two applications 
  378.  
  379.  KP> are LOCKED (CTRL-ALT-DEL type) unless you can abort them.
  380.  
  381. KEVIN,
  382.         Sorry but I disagree, we are using multiple
  383. relations on an application at the office and our first rule
  384. is if you can't lock records in every file pertaining to the
  385. current operation [IE: if deleting a record we lock all
  386. related records in every other database before going on]
  387. then we simply abort the operation or suspend it until ALL
  388. records can be securely worked on.
  389.  
  390.         It's simple logic, you can't just modify the header
  391. file and then try to move on to the message-text file, you
  392. need to secure every related bits of that single message,
  393. header and all.
  394.  
  395.         Anyone doing it any other way is asking for trouble
  396. and I sure wouldn't want him on my team. We got 10,000+
  397. records containing data for that many legal actions
  398. currently engaged either in court or under investigation in
  399. over 30 governement agencies. One screw-up would be
  400. disastrous and mean possibly thousands of dollars in loss for
  401. the Departement.
  402.  
  403.         We put every safety precaution into our system, in
  404. fact it is so safe it was firstly meant as a DEMO of what
  405. the new main-frame system should look like but the
  406. Treasure-Board decided to keep our system. The main-frame
  407. people had been sitting on the project for over 3 years
  408. without a single line of code written, we got our DEMO
  409. version out in 6 months and have been enhansing it ever
  410. since.
  411.  
  412.         Our next step is networking it and what you
  413. described was something we wanted to avoid at all costs.
  414. That's why we either secure our environement before doing
  415. anything else or don't do anything.
  416.  
  417.         We thought of batch processing transactions during
  418. the night to avoid conflicts but that was one of the
  419. draw-backs of the main-frame environement. Records have to
  420. be updated on the fly and the new data available
  421. immediatetly to all stations.
  422.  
  423.         Best regards,
  424.         Mark Ouellet.
  425.  
  426.  
  427.  
  428. --- ME2
  429.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  430.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  431.  
  432. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  433.  
  434. Conference 4
  435. Date       05-02-92 17:06:50
  436. From       Mark Ouellet
  437. To         Michael Thomsen
  438. Subject    Re: testing records for equality
  439.  
  440.  
  441.     On 20 Apr 92, you, Michael Thomsen, of 2:201/111.0 wrote...
  442.  
  443.  MT> Sorry to interrupt this conversation, But maybe this could help !
  444.  MT> Type
  445.  MT> MyRec = Record
  446.  MT> Case Byte Of
  447.  MT> 1 :(
  448.  MT> Check   : LongInt;
  449.  MT> Field1  : String[80];
  450.  MT> Field2  : Array[1..15] Of Byte;
  451.  MT> );
  452.  MT> 2 :(
  453.  MT> Total   : Array[1..100] Of Char;
  454.  MT> );
  455.  MT> End;
  456.  MT> (* Total have to be same size as the total RecLength, and it have to be
  457.  
  458.  MT> Declaired as a Array of Char (Don't ask me why !!)  *)
  459.  MT> Var
  460.  MT> Re1,
  461.  MT> Re2 : MyRec;
  462.  MT> Begin
  463.  MT> If Re1.Total = Re2.Total Then
  464.  MT> Write(^G);
  465.  MT> End.
  466.  MT> Greetings Michael Thomsen (STOCKHOLM, SWEDEN)
  467.  
  468. Michael,
  469. it can't work, try this:
  470.  
  471.         1: declare 2 instances of the record
  472.         2: Write 2 70 caracter long strings to both records,
  473.            a different one for each record.
  474.  
  475.         3: Now write 'SHOULD BE EQUAL' to both records.
  476.         4: Compare both records and they won't compare
  477.  
  478.  
  479. Want to know why:
  480.  
  481.         Take two equal size cups, fill one with Salt water,
  482.         fill the other with Sugar saturated water. Now
  483.         remove 1/2 a cup of liquid from both, and fill them
  484.         both to the top again this time using Cool-Aid for
  485.         both.
  486.  
  487.         Now taste them both... Not exactly equal right?? ;-)
  488.  
  489. The same thing happens with strings, when you declare
  490. strings as String[XX] you are telling TP to reserve enough
  491. space for a maximum of XX caracters for that string. When
  492. you write data to a string you are not overwriting it
  493. completly if you don't write XX caracters to it. That is why
  494. after my first test, there is still data after the "L" of
  495. equal, only the length byte tells TP not to bother with what
  496. might be left there. To convince youself, if you name the
  497. two records 'REC1' and 'REC2', after you have done what I
  498. said try this:
  499.  
  500.         Rec1.Field1 [0] := #70;
  501.         Rec2.Field1 [0] := #70;
  502.         Writeln( Rec1.Field1 );
  503.         writeln( Rec2.Field1 );
  504.  
  505. You should get different results and remember your compare
  506. function actually compares 100 bytes.
  507.  
  508.  
  509.         Best regards,
  510.         Mark Ouellet.
  511.  
  512.  
  513.  
  514. --- ME2
  515.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  516.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  517.  
  518. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  519.  
  520. Conference 4
  521. Date       05-02-92 20:55:39
  522. From       Mark Ouellet
  523. To         Trevor Carlsen
  524. Subject    Re: Question, Compression
  525.  
  526.  
  527.     On 25 Apr 92, you, Trevor Carlsen, of 3:690/644.0 wrote...
  528.  
  529.  TC> {$REDFACE+}
  530.  TC> 
  531.  TC> I cannot believe that I did not twig to your humour :-(  Well done.
  532.  TC> 
  533.  TC> BTW the 1meg:1 compression message - the first thing I did was to check 
  534.  
  535.  TC> if it was written on 1st April.  When I saw that it was not, I thought 
  536.  
  537.  TC> to post a message that the writer must have heard this rumour on that 
  538.  
  539.  TC> date.  Then I though better say nothing and just sit back and see how 
  540.  
  541.  TC> many would be sucked in.  -  The mind boggles...
  542.  
  543. TeeCee,
  544.         as a side note I tested Pkzip with a 4Meg file of
  545. the same caracter, pkzip compressed it to about 4000 bytes.
  546.  
  547.         Best regards,
  548.         Mark Ouellet.
  549.  
  550.  
  551.  
  552. --- ME2
  553.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  554.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  555.  
  556. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  557.  
  558. Conference 4
  559. Date       05-02-92 21:01:31
  560. From       Mark Ouellet
  561. To         Robert Jenkins
  562. Subject    Re: TP 6.0
  563.  
  564.  
  565.     On 25 Apr 92, you, Robert Jenkins, of 1:389/5.0 wrote...
  566.  
  567.  RJ> I have a book called 'Mastering Turbo Pascal 6.0' by Tom Swan and it is 
  568.  
  569.  RJ> a GREAT book for beginners!!  Cost about $25 or so...
  570.  
  571. Robert,
  572.         Does it have a TVision section?? If so how long and
  573. how good ??
  574.  
  575.         Best regards,
  576.         Mark Ouellet.
  577.  
  578.  
  579.  
  580. --- ME2
  581.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  582.  * Tossed by SFToss v1.00b on 92/05/03  12:20:37
  583.  
  584. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  585.  
  586. Conference 4
  587. Date       05-03-92 13:38:58
  588. From       Trevor Carlsen
  589. To         Max Maischein
  590. Subject    Bits and bytes
  591.  
  592.  
  593.  
  594.  MM>  Function Byte_2_Bin ( B : Byte ) : String;
  595.  MM>  Var S : String[ 8 ];
  596.  MM>      I : Byte;
  597.  MM>  Begin
  598.  MM>  S[ 0 ] := #8;
  599.  MM>  For I := 0 to 7 do
  600.  MM>  Begin
  601.  MM>  If ( B and ( 1 shl ( 7-I ))) > 0
  602.  MM>    then S[ I+1 ] := '1'
  603.  MM>    else S[ I+1 ] := '0';
  604.  MM>  End;
  605.  MM>    Byte_2_Bin := S;
  606.  MM>  End;
  607.  
  608. Here are two alternatives -
  609.  
  610. function BinStr(B: byte): string;
  611.   var x : byte;
  612.   begin
  613.     BinStr[0] := #8;
  614.     for x := 7 downto 0 do
  615.       BinStr[8 - x] := chr(ord('0')+ord(odd(B shr x)));
  616.   end;
  617.  
  618. procedure Bin2Str(var st: string; b: byte);
  619.   var x : byte;
  620.   begin
  621.     st[0] := #8;
  622.     for x := 7 downto 0 do
  623.       st[8 - x] := chr(ord('0')+ord(odd(B shr x)));
  624.   end;
  625.  
  626. The function BinStr is 11% faster than Bin_2_Str and the procedure Bin2Str
  627. is 39% faster.
  628.  
  629. TeeCee
  630.  
  631. --- TC-ED   v2.01  
  632.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  633.  * Tossed by SFToss v1.00b on 92/05/03  12:20:52
  634.  
  635. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  636.  
  637. Conference 4
  638. Date       05-03-92 14:26:14
  639. From       Trevor Carlsen
  640. To         Brian Stark
  641. Subject    Dynamic arrays...
  642.  
  643.  
  644.  
  645.  GS> Array[0..65519] of byte; or whatever.  Then you'll never get the
  646.  GS> compiler out of range error.
  647.  BS> Ok, but that defeats the purpose of creating the dynamic array. I 
  648.  BS> would like to be able to create a structure that will contain a file's 
  649.  
  650.  BS> data, and nothing more.... Creating an array of 0..65519 wouldn't make 
  651.  
  652.  BS> sense as only a small part of it would be used -- probably less than 
  653.  
  654.  BS> 3K in my application.
  655.  
  656. No... a type declaration occupies NO memory.  The memory allocation would
  657. only be what you decided when it is allocated.
  658.  
  659. TeeCee
  660.  
  661.  
  662.  
  663. --- TC-ED   v2.01  
  664.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  665.  * Tossed by SFToss v1.00b on 92/05/03  12:20:52
  666.  
  667. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  668.  
  669. Conference 4
  670. Date       05-03-92 17:30:33
  671. From       Trevor Carlsen
  672. To         Gerald Gutierrez
  673. Subject    Procedures...
  674.  
  675.  
  676.  
  677.  GG> Let us consider two very simple, and yet common examples:
  678.  
  679.  GG> Now -- obviously both these two examples are clearly understandable in 
  680.  
  681.  GG> their current state, but let's grab a text editor and put the 500 
  682.  GG> lines into both of them. Now -- to indent improperly or not to indent 
  683.  
  684.  GG> at all would certainly be a very poor practice of a structured 
  685.  GG> language. You have to insert one more Conditional in the beginning -- 
  686.  
  687.  GG> say, is the food rotten ? Are you going to waste your time indenting 
  688.  
  689.  GG> properly every single line of your paticular source ? Another 
  690.  GG> situation. Suppose you have to delete a conditional. ie: you don't 
  691.  GG> care what type of food anymore, there you go again wasting time 
  692.  GG> unindenting code.
  693.  
  694. Exits are unnecessary here.  The 500 lines should be in another procedure,
  695. or more to the point, in several other procedures.
  696.  
  697.  GG> Another very common example. Let's say you have a routine in which you 
  698.  
  699.  GG> have level after level of IF statements. At the 7th level, you must 
  700.  GG> check a certain variable for a critical error, and if the error is 
  701.  GG> present, you must exit immediately. Please tell me how you would go 
  702.  GG> around exiting this paticular situation immediately without execution 
  703.  
  704.  GG> of any more code, without using Exit.
  705.  
  706. This is a valid case when exits are desirable.  There are many others also.
  707.  If they make code more readable then they should always be considered.
  708.  
  709. TeeCee
  710.  
  711. --- TC-ED   v2.01  
  712.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  713.  * Tossed by SFToss v1.00b on 92/05/03  12:20:52
  714.  
  715. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  716.  
  717. Conference 4
  718. Date       05-03-92 00:00:00
  719. From       Terry Hughes
  720. To         Rob Kittredge
  721. Subject    Re: Looking for
  722.  
  723.  
  724. RK>RK>Any plans on including SeaLink sometime in the future?  It
  725. RK>RK>is a variation of Xmodem...I have been able to write one
  726. RK>RK>myself but it is nowhere near as fancy as any of Async
  727. RK>RK>Pro's protocols!!!  And probably not as reliable either!
  728.  
  729. RK>TH> Well, it is on the list of things-to-get-to but there are
  730. RK>TH> quite a few things in front of it.
  731.  
  732. RK>If I may ask, what types of things are *LEFT* to add?? Only
  733. RK>ZIP compression is all I can think of! :-)
  734.  
  735. In case you weren't aware, we added ZIP shrink and store to
  736. APRO 1.03, leaving only ZIP implode and LHA 2.0 yet undone.
  737.  
  738. The other most immediate items are adding background
  739. capabilities to Kermit and ASCII (Xmodem, Ymodem and Zmodem
  740. were converted to background protocols in 1.03).
  741.  
  742. After that comes a host of smaller issues: more terminal
  743. emulations, other protocols, more device layers and so on.
  744. Many of these issues will likely take a back seat to the C and
  745. Windows versions of APRO.
  746.  
  747. -Terry
  748.  
  749.  * OLX 2.2 * TurboPower Software (voice 719-260-6641)
  750.  
  751. --- Maximus 2.01wb
  752.  * Origin: The Programmers Playhouse (1:128/60)
  753.  * Tossed by SFToss v1.00b on 92/05/04  07:42:23
  754.  
  755. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  756.  
  757. Conference 4
  758. Date       05-03-92 00:00:02
  759. From       Terry Hughes
  760. To         Jud Mccranie
  761. Subject    B-Treee Filer Suggestion
  762.  
  763.  
  764. JM>How about a "make data base application" similar to make menu and make
  765. JM>screen for users of b-tree and *Pro?  That would be really nice, and I
  766. JM>don't think it would be that hard to do with make menu, make screen
  767. JM>(especially) and the sample b-tree sample programs you already have.
  768. JM>Then we could create database apps faster, quicker, better, and produce
  769. JM>much better programs than dBase people.  The make DB app would have the
  770. JM>standard browse, editing, and printing facilities.
  771.  
  772. We've long planned higher level tools for B-Tree Filer,
  773. including a data dictionary, query language and so on.
  774. Unfortunately, those things keep getting assigned a lower
  775. priority than other tools so I can't say when you might
  776. actually see such products.
  777.  
  778. In case you weren't already aware, there is product out called
  779. B-Tree Dictionary (by Turbo Toolware) that has a data
  780. dictionary, query language and design tools that build on top of
  781. B-Tree Filer and Object Professional. I don't have their number
  782. here at home but if you call our office at the number below we
  783. can get if for you.
  784.  
  785. -Terry
  786.  
  787.  * OLX 2.2 * TurboPower Software (voice 719-260-6641)
  788.  
  789. --- Maximus 2.01wb
  790.  * Origin: The Programmers Playhouse (1:128/60)
  791.  * Tossed by SFToss v1.00b on 92/05/04  07:42:23
  792.  
  793. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  794.  
  795. Conference 4
  796. Date       05-02-92 23:35:05
  797. From       Mark Ouellet
  798. To         Gerald Gutierrez
  799. Subject    Re: Freq it !
  800.  
  801.  
  802.     On 23 Apr 92, you, Gerald Gutierrez, of 1:153/715.5 wrote...
  803.  
  804.  GG> Hi Mark -- apologies for the late notice. I have sent it up to my host 
  805.  
  806.  GG> already under the filename EXP_SRC.ARJ.
  807.  
  808. thanks Gerald,
  809.         I'll go and pick it up.
  810.  
  811.         Best regards,
  812.         Mark Ouellet.
  813.  
  814.  
  815.  
  816. --- ME2
  817.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  818.  * Tossed by SFToss v1.00b on 92/05/04  15:12:47
  819.  
  820. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  821.  
  822. Conference 4
  823. Date       05-02-92 23:44:30
  824. From       Mark Ouellet
  825. To         Greg Johnson
  826. Subject    Re: Network Game
  827.  
  828.  
  829.     On 26 Apr 92, you, Greg Johnson, of 1:232/32.0 wrote...
  830.  
  831.  GJ> I'm going to butt in here for a minute...can you send it to me also...I 
  832.  
  833.  GJ> can
  834.  GJ> send you postage?
  835.  
  836. Greg,
  837.         David put it up for freq and download as you
  838. probably have seen if you followed the thread.
  839.  
  840.         Best regards,
  841.         Mark Ouellet.
  842.  
  843.  
  844.  
  845. --- ME2
  846.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  847.  * Tossed by SFToss v1.00b on 92/05/04  15:12:47
  848.  
  849. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  850.  
  851. Conference 4
  852. Date       05-03-92 15:23:14
  853. From       Mark Ouellet
  854. To         Ruurd Pels
  855. Subject    Re: Shelling To Dos
  856.  
  857.  
  858.     On 22 Apr 92, you, Ruurd Pels, of 2:512/23.0 wrote...
  859.  
  860.  BB>> Is there a simple way to have my compiled PASCAL program shell to 
  861.  BB>> DOS?
  862.  BB>> I don't need to shell to do anything serious: just a quick look 
  863.  BB>> around
  864.  BB>> the drive, run a small program, etc.  In QuickBasic, there is a 
  865.  BB>> command
  866.  BB>> called SHELL, that allows you to go to DOS, and to type 'EXIT' when 
  867.  
  868.  BB>> you
  869.  BB>> are ready to leave.  Anything equivalent in TP 5.5? Thanks for any
  870.  BB>> help.
  871.  
  872.  RP> Look up System().
  873.  
  874. Ruurd,
  875.         wrong language, right answer (For that other
  876. language).
  877.  
  878.         Don't you think EXEC would be more apropriate ;-)
  879.  
  880.         Best regards,
  881.         Mark Ouellet.
  882.  
  883.  
  884.  
  885. --- ME2
  886.  * Origin: One BEER gets me drunk.... usualy the 47th ;-) (Fidonet 1:240/1.4)
  887.  * Tossed by SFToss v1.00b on 92/05/04  15:12:47
  888.  
  889. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  890.  
  891. Conference 4
  892. Date       05-03-92 12:13:00
  893. From       Werner Berghofer
  894. To         Robert Soubie
  895. Subject    SAA/CUA standards
  896.  
  897.  
  898.  
  899.  
  900.  
  901.        Robert,
  902.  
  903.  > The point with this "standard" is that it is adapted
  904.  > to english, not to foreign languages.
  905.  
  906.        please keep in mind that English is worldwide the "official" EDP language
  907.   Speaking for my person I'm very happy with this.  IMHO there's nothing more
  908. ridiculous and questionable than user interfaces or documentations which have
  909. been translated from English to another language.
  910.  
  911.        Computer related terminilogy has its origins in English, most of its
  912. conceptions and terms simply are not translatable.  If I have to use a program
  913. with a German user interface nearly always I translate its menus back into
  914. English to figure out what for heaven's sake they mean.  Of course the better
  915. solution would be to delete this program ;-)
  916.  
  917.        I even comment my Pascal sources in English; writing German would sacrifi
  918. e most of its unequivocal brevity.
  919.  
  920.        Werner.
  921.  
  922. ---
  923.  * Origin: ! (2:310/90.100)
  924.  * Tossed by SFToss v1.00b on 92/05/04  15:12:50
  925.  
  926. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  927.  
  928. Conference 4
  929. Date       05-03-92 20:32:00
  930. From       Norbert Igl
  931. To         Matt Heck
  932. Subject    SoundBlaster Source Code...
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  > Everyone is looking for Soundblaster/AdLib source code.
  939.  > The reality is:
  940.  
  941.  >      No one has any.
  942.  >      Not one person.
  943.  >      None. At all.
  944.  
  945. hmmm...there must have been something....(seek...)...BINGO!
  946.  
  947. -------------------------8<---------------------------------
  948.  
  949. Wed 29 Jan 92
  950. By: Patrick Maartense
  951. To: Gerald Gutierrez
  952. Re: Accessing the SB 1/3
  953. ---------------------------------------------------------------------------
  954. {---------------------------------------------------------------------------
  955.                    Unit SBVoice (v1.00) for Turbo Pascal 6.0
  956.        For interfacing with the SoundBlaster's digitized voice channel.
  957.            Copyright (c) 1991, Amit K. Mathur, Windsor, Ontario.
  958.  
  959.                         By: Amit K. Mathur
  960.                             3215 St. Patrick's Drive
  961.                             Windsor, Ontario
  962.                             N9E 3H2 CANADA
  963.                         Ph: (519) 966-6924
  964.  
  965.  Networks:  RIME(tm) R/O ->WINDSOR, ILink (Shareware), NA-Net (Gaming),
  966.             WWIVNet (#198@5950), or direct on NorthSTAR (519)735-1504.
  967.  
  968.  These routines are released to the public domain.  However I will gladly
  969.  accept contributions towards further development of this and other products.
  970.  Please send any changes or improvements my way.  And I'm interested in
  971.  other SoundBlaster utilities and programming tools.  Thanks in advance.
  972.  --------------------------------------------------------------------------}
  973.  
  974. {$O+,F+}
  975. { Allow this Unit to Be Overlayed (doesn't affect compilation if you decide
  976.   not to overlay it), and force far calls.                                 }
  977.  
  978.  
  979. unit SBVoice;
  980.  
  981. interface
  982.  
  983. uses MemAlloc;                                    { Memory Allocation Proc }
  984.  
  985.  
  986. var  SoundFile: Array[1..25000] of byte;          { whatever size you want }
  987.  
  988.      sgSBDriver, ofSBDriver: word;                { seg and ofs of Driver  }
  989.  
  990.      SBDriver: Pointer;                           { pointer to the driver  }
  991.  
  992.      StatusWord: Word;                            { stores SB status       }
  993.  
  994.  
  995. procedure loaddriver(fi:string);
  996. { Loads CT-VOICE.DRV into memory.  'fi' is the path to the driver.         }
  997.  
  998.  
  999. procedure closedriver;
  1000. { Clean up routine.  Not really necessary if your program is over.         }
  1001.  
  1002.  
  1003. procedure loadvoice(f:string;start,size:word);
  1004. { Load 'f' into memory.  Start is the start of the area within
  1005.   'f' to load and size is the amount to laod.  If you set size to 0
  1006.   then it will load the entire file.                                      }
  1007.  
  1008.  
  1009. function sb_getversion:integer;
  1010. { Get the version number of the CT-VOICE.DRV
  1011.   Returns the Version number                                              }
  1012.  
  1013.  
  1014. function sb_init:integer;
  1015. { Initialize the SoundBlaster.  Call this right after load driver, unless
  1016.   you have to change the BaseIOAddress or Interrupt number and haven't
  1017.   changed the CT-VOICE.DRV file itself.
  1018.   Returns:  0 - no problem
  1019.             1 - sound card failiure
  1020.             2 - I/O failiure
  1021.             3 - DMA interrupt failiure                                    }
  1022.  
  1023.  
  1024. procedure sb_output(sg,os:word);
  1025. { Output the digitized sound.  You must load the sound first!
  1026.   sg and os are the segment and offset of either SoundFile or whatever
  1027.   array you use to store the sound.  If you use a .VOC file then call
  1028.   with 26 added to the offset.                                            }
  1029.  
  1030.  
  1031. procedure sb_setstatusword(sg,os:word);
  1032. { Sets the location of the status word.  This is the third thing you should
  1033.   do, after loading the driver and initializing it.
  1034.   The StatusWord will contain $0FFFF if input/output is in output, and
  1035.   0 when it's done.  It will also hold the values of the markers in voice
  1036.   files if any are encounterred, allowing you to coordinate output with
  1037.   your programs.                                                          }
  1038.  
  1039.  
  1040. procedure sb_speaker(mode:word);
  1041. { Set the speaker on/off.  Off is mode 0, and On is anything else.  This
  1042.   is the fourth thing you should do in your initialization.               }
  1043.  
  1044.  
  1045. procedure sb_uninstall;
  1046. { Uninstall the driver from memory.   Used by CloseDriver.                }
  1047.  
  1048.  
  1049. procedure sb_setIOaddress(add:word);
  1050. { Override the IOaddress found inside the CT-VOICE.DRV file.  Add is the
  1051.   new IO address.                                                         }
  1052.  
  1053.  
  1054. procedure sb_setinterruptnumber(intno:word);
  1055. { Allows you to override the Interrupt number in the driver.  IntNo is your
  1056.   new interrupt number (3, 5, 7 or 9).                                    }
  1057.  
  1058.  
  1059. procedure sb_stopoutput;
  1060. { Stops the output in progress                                            }
  1061.  
  1062.  
  1063. function sb_pauseoutput: integer;
  1064. { Pauses the output in progress.
  1065.   Returns:  0 - success
  1066.             1 - fail                                                      }
  1067.  
  1068.  
  1069. function sb_continueoutput: integer;
  1070. { Continues a paused output.
  1071.   Returns:  0 - success
  1072.             1 - fail (nothing to continue)                                }
  1073.  
  1074.  
  1075. function sb_breakloop(mode:word): integer;
  1076. { Breaks out of the currect output loop.
  1077.   Modes:  0 - continue round, stop when done
  1078.           1 - stop immediately
  1079.   Returns:  0 - success
  1080.             1 - not in loop                                               }
  1081.  
  1082.  
  1083. procedure sb_input(highlength,lowlength,seginputbuff,ofsinputbuff:word);
  1084. { Input digitized sound.
  1085.   HighLength: The high byte of the length of the input buffer.
  1086.   LowLength:  The low byte of the length of the input buffer.
  1087.   SegInputBuff: The Segment of the start of the input buffer.
  1088.   OfsInputBuff: The Offset of the start of the input buffer.              }
  1089.  
  1090.  
  1091. procedure sb_setuserfunction(segaddress,ofsaddress:word);
  1092. { Sets up a user function that the SB calls when it encounters a new data
  1093.   block.  It must perform a FAR ret, preserve DS,DI,SI and flag register.
  1094.   Clear Carry flag if you want the driver to process the block, or set it
  1095.   if your routine will.  It must be clear if the block type is 0, that
  1096.   is the terminate block.
  1097.   SegAddress is the segment of your user function in memory.
  1098.   OfsAddress is the ofset of your user function in memory.                }
  1099.  
  1100.  
  1101. implementation
  1102.  
  1103. uses DOS;
  1104.  
  1105. procedure Abort(s:string);
  1106. begin
  1107.   writeln('The Following Error Has Occurred: ',s);
  1108.   writeln('Remedy and try again.  We apologize for any inconvenience.');
  1109.   halt(1);
  1110. end;
  1111.  
  1112. procedure loaddriver(fi:string);
  1113. var f: file;
  1114.     k: integer;
  1115.     t: string[8];
  1116. begin
  1117.     assign(f,fi+'CT-VOICE.DRV');
  1118.     {$I-} Reset(f,1); {$I+}
  1119.     if IOResult <> 0 then
  1120.         Abort('Cannot Open '+fi+'CT-VOICE.DRV');
  1121.     blockread(f,Mem[sgSBDriver:ofSBDriver],filesize(f));
  1122.     close(f);
  1123.     t:='';
  1124.     for k:=0 to 7 do
  1125.         t:=t+chr(Mem[sgSBDriver:ofSBDriver+k+3]);
  1126.     if t<>'CT-VOICE' then
  1127.         abort('Invalid CT-VOICE Driver!');
  1128. end;
  1129.  
  1130. procedure closedriver;
  1131. begin
  1132.     sb_uninstall;
  1133.     if dalloc(sbdriver)=0 then
  1134.         abort('Uninstall Error!');
  1135. end;
  1136.  
  1137. procedure loadvoice(f:string;start,size:word);
  1138. var fi: file;
  1139.     k: word;
  1140. begin
  1141.     assign(fi,f);
  1142.     {$I-} Reset(fi,1); {$I+}
  1143.     if IOResult <> 0 then
  1144.        abort('Cannot Open '+f+'!');
  1145.     k:=0;
  1146.     seek(fi,start);
  1147.     if size=0 then size:=filesize(fi);
  1148.     blockread(fi,Mem[seg(soundfile):ofs(soundfile)],size);
  1149.     close(fi);
  1150. end;
  1151.  
  1152. function sb_getversion: integer; assembler;
  1153. asm
  1154.    push  bp
  1155.    mov   bx,0
  1156.    call  SBDriver
  1157.    pop   bp
  1158. end;
  1159.  
  1160. procedure sb_setIOaddress(add:word); assembler;
  1161. asm
  1162.    push  bp
  1163.    mov   bx,1
  1164.    mov   ax,add
  1165.    call  SBDriver
  1166.    pop   bp
  1167. end;
  1168.  
  1169. procedure sb_setinterruptnumber(intno:word); assembler;
  1170. asm
  1171.    push  bp
  1172.    mov   bx,2
  1173.    mov   ax,intno
  1174.    call  SBDriver
  1175.    pop   bp
  1176. end;
  1177.  
  1178. procedure sb_stopoutput; assembler;
  1179. asm
  1180.    push  bp
  1181.    mov   bx,8
  1182.    call  SBDriver
  1183.    pop   bp
  1184. end;
  1185.  
  1186. function sb_init: integer; assembler;
  1187. asm
  1188.    push  bp
  1189.    mov   bx, 3
  1190.    call  SBDriver
  1191.    pop   bp
  1192. end;
  1193.  
  1194. function sb_pauseoutput: integer; assembler;
  1195. asm
  1196.    push  bp
  1197.    mov   bx,10
  1198.    call  SBDriver
  1199.    pop   bp
  1200. end;
  1201.  
  1202. function sb_continueoutput: integer; assembler;
  1203. asm
  1204.    push  bp
  1205.    mov   bx,11
  1206.    call  SBDriver
  1207.    pop   bp
  1208. end;
  1209.  
  1210. function sb_breakloop(mode:word): integer; assembler;
  1211. asm
  1212.    push  bp
  1213.    mov   bx,12
  1214.    mov   ax,mode
  1215.    call  SBDriver
  1216.    pop   bp
  1217. end;
  1218.  
  1219. procedure sb_output(sg,os:word); assembler;
  1220. asm
  1221.     push bp
  1222.     push di
  1223.     mov  bx,6
  1224.     mov  di,os             { offset of voice  }
  1225.     mov  es,sg             { segment of voice }
  1226.     call SBDriver
  1227.     pop  di
  1228.     pop  bp
  1229. end;
  1230.  
  1231. procedure sb_input(highlength,lowlength,seginputbuff,ofsinputbuff:word);
  1232. assembler;
  1233. asm
  1234.     push bp
  1235.     push di
  1236.     mov  bx,7
  1237.     mov  dx,highlength
  1238.     mov  cx,lowlength
  1239.     mov  es,seginputbuff
  1240.     mov  di,ofsinputbuff
  1241.     call SBDriver
  1242.     pop  di
  1243.     pop  bp
  1244. end;
  1245.  
  1246. procedure sb_setstatusword(sg,os:word); assembler;
  1247. asm
  1248.     push bp
  1249.     push di
  1250.     mov  bx,5
  1251.     mov  di,os
  1252.     mov  es,sg
  1253.     call SBDriver
  1254.     pop  di
  1255.     pop  bp
  1256. end;
  1257.  
  1258. procedure sb_speaker(mode:word); assembler;
  1259. asm
  1260.    push  bp
  1261.    mov   bx,4
  1262.    mov   ax,mode
  1263.    call  SBDriver
  1264.    pop   bp
  1265. end;
  1266.  
  1267. procedure sb_uninstall; assembler;
  1268. asm
  1269.    push  bp
  1270.    mov   bx,9
  1271.    call  SBDriver
  1272.    pop   bp
  1273. end;
  1274.  
  1275. procedure sb_setuserfunction(segaddress,ofsaddress:word); assembler;
  1276. asm
  1277.    push  bp
  1278.    mov   dx,segaddress
  1279.    mov   ax,ofsaddress
  1280.    mov   bx,13
  1281.    call  SBDriver
  1282.    pop   bp
  1283. end;
  1284.  
  1285.  
  1286. begin {set up SB}
  1287.  
  1288.   If DOSMemAvail < 2500 then                           { lower the heap   }
  1289.  
  1290.       abort('Not Enough Memory');                      { with $M to fix   }
  1291.  
  1292.   StatusWord:=MAlloc(SBDriver,2500);
  1293.   if StatusWord<>0 then
  1294.       abort('Memory Allocation Error');
  1295.  
  1296.   sgSBDriver:=MemW[seg(SBDriver):ofs(SBDriver)+2];
  1297.   ofSBDriver:=MemW[seg(SBDriver):ofs(SBDriver)];
  1298.  
  1299.   Loaddriver('d:\sb\drv\');                            { change at will   }
  1300.  
  1301.   if sb_init<>0 then                                   { or stick in your }
  1302.  
  1303.       abort('SoundBlaster Initialization Error!');     { own program init }
  1304.  
  1305.  
  1306.   sb_setstatusword(seg(statusword),ofs(statusword));   { see above        }
  1307.  
  1308.   sb_speaker(1);                                       { again!           }
  1309.  
  1310.  
  1311. end.
  1312.  
  1313. ---------------------------------------------------------------------------
  1314. Wed 29 Jan 92
  1315. By: Patrick Maartense
  1316. To: Gerald Gutierrez
  1317. Re: Accessing the SB 2/3
  1318. ---------------------------------------------------------------------------
  1319.  
  1320. Unit MemAlloc;
  1321.  
  1322. { Purpose is to provide the ability to create (destroy) dynamic variables  }
  1323.  
  1324. { without needing to reserve heap space at compile time.                   }
  1325.  
  1326.  
  1327. Interface
  1328.  
  1329. Function Malloc(Var Ptr; Size : Word) : Word;
  1330. { Allocate free memory and return a pointer to it.  The amount of memory      }
  1331.  
  1332. { requested from DOS is calculated as (Size/4)+1 paragraphs.  If the          }
  1333.  
  1334. { allocation is successful, the untyped VAR parameter Ptr will be populated   }
  1335.  
  1336. { with the address of the allocated memory block, and the function will return}
  1337. { a zero result.  Should the request to DOS fail, Ptr will be populated with  }
  1338.  
  1339. { the value NIL, and the function will return the appropriate DOS error code. }
  1340.  
  1341.  
  1342. Function Dalloc(Var Ptr) : Word;
  1343. { Deallocate the memory pointed to by the untyped VAR parameter Ptr           }
  1344.  
  1345.  
  1346. Function DosMemAvail : LongInt;
  1347. { Return the size of the largest contiguous chuck of memory available for use }
  1348.  
  1349.  
  1350. { --------------------------------------------------------------------------- }
  1351.  
  1352.  
  1353. Implementation
  1354.  
  1355. { --------------------------------------------------------------------------- }
  1356.  
  1357.  
  1358. Function Malloc(Var Ptr; Size : Word) : Word;
  1359. Begin
  1360.    Inline(
  1361.      $8B/$46/<SIZE/         {            mov         ax,[bp+<Size]}
  1362.      $B9/$04/$00/           {            mov         cx,4}
  1363.      $D3/$E8/               {            shr         ax,cl}
  1364.      $40/                   {            inc         ax}
  1365.      $89/$C3/               {            mov         bx,ax}
  1366.      $B4/$48/               {            mov         ah,$48}
  1367.      $CD/$21/               {            int         $21             ;Allocate
  1368. memory}
  1369.      $72/$07/               {            jc          AllocErr        ;If any
  1370. errors ....}
  1371.      $C7/$46/$FE/$00/$00/   {NoErrors:   mov word    [bp-2],0        ;Return 0
  1372.  
  1373. for successful allocation}
  1374.      $EB/$05/               {            jmp short   Exit}
  1375.      $89/$46/$FE/           {AllocErr:   mov         [bp-2],ax       ;Return
  1376. error code}
  1377.      $31/$C0/               {            xor         ax,ax           ;Store a
  1378.  
  1379. NIL value into the ptr}
  1380.      $C4/$7E/<PTR/          {Exit:       les         di,[bp+<Ptr]    ;Address
  1381. of pointer into es:di}
  1382.      $50/                   {            push        ax              ;Save the
  1383.  
  1384. Segment part}
  1385.      $31/$C0/               {            xor         ax,ax           ;Offset is
  1386.  
  1387. always 0}
  1388.      $FC/                   {            cld                         ;Make sure
  1389.  
  1390. direction is upward}
  1391.      $AB/                   {            stosw                       ;Store
  1392. offset of memory block}
  1393.      $58/                   {            pop         ax              ;Get back
  1394.  
  1395. segment part}
  1396.      $AB);                  {            stosw                       ;Store
  1397. segment of memory block}
  1398.  
  1399. End {Malloc};
  1400.  
  1401. { --------------------------------------------------------------------------- }
  1402.  
  1403.  
  1404. Function Dalloc(Var Ptr) : Word;
  1405. Begin
  1406.    If Pointer(Ptr) <> NIL then begin
  1407.       Inline(
  1408.         $B4/$49/               {            mov         ah,$49}
  1409.         $C4/$7E/<PTR/          {            les         di,[bp+<Ptr]}
  1410.         $26/$C4/$3D/           {        es: les         di,[di]}
  1411.         $CD/$21/               {            int         $21}
  1412.         $72/$02/               {            jc          Exit}
  1413.         $31/$C0/               {NoError:    xor         ax,ax}
  1414.         $89/$46/$FE);          {Exit:       mov         [bp-2],ax}
  1415.       Pointer(Ptr) := NIL;
  1416.    end {if}
  1417.    else
  1418.       Dalloc := 0;
  1419. End {Dealloc};
  1420.  
  1421. { --------------------------------------------------------------------------- }
  1422.  
  1423.  
  1424. Function DosMemAvail : LongInt;
  1425. Begin
  1426.    Inline(
  1427.      $BB/$FF/$FF/           {         mov         bx,$FFFF}
  1428.      $B4/$48/               {         mov         ah,$48}
  1429.      $CD/$21/               {         int         $21}
  1430.      $89/$D8/               {         mov         ax,bx}
  1431.      $B9/$10/$00/           {         mov         cx,16}
  1432.      $F7/$E1/               {         mul         cx}
  1433.      $89/$46/$FC/           {         mov         [bp-4],ax}
  1434.      $89/$56/$FE);          {         mov         [bp-2],dx}
  1435.  
  1436. Continued next message...
  1437.  
  1438.  * Tossed by SFToss v1.00b on 92/05/04  15:12:51
  1439.  
  1440. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1441.  
  1442. Conference 4
  1443. Date       05-03-92 20:32:00
  1444. From       Norbert Igl
  1445. To         Matt Heck
  1446. Subject    SoundBlaster Source Code...
  1447.  
  1448.  
  1449. ... Continued from previous message
  1450.  
  1451. end {DosMemAvail};
  1452.  
  1453. End {Unit MemAlloc}.
  1454.  
  1455. ---------------------------------------------------------------------------
  1456. Wed 29 Jan 92
  1457. By: Patrick Maartense
  1458. To: Gerald Gutierrez
  1459. Re: Accessing the SB 3/3
  1460. ---------------------------------------------------------------------------
  1461. {$M 16384,0,0}
  1462.  
  1463. program Demo; { to demonstrate the SBVoice Unit }
  1464.               { Copyright 1991 Amit K. Mathur, Windsor, Ontario }
  1465.  
  1466. uses SBVoice;
  1467.  
  1468. begin
  1469. if paramcount>0 then begin
  1470.     LoadVoice(paramstr(1),0,0);
  1471.     sb_Output(seg(soundfile),ofs(soundfile)+26);
  1472.     repeat
  1473.          write('Demo of the SBVoice Unit, Copyright 1991 by Amit K. Mathur ---
  1474.  
  1475. ');
  1476.     until StatusWord=0;
  1477. end else
  1478.     writeln('Usage: DEMO [d:\path\]filename.voc');
  1479. end.
  1480.  
  1481. -------------------------8<---------------------------------
  1482.  
  1483. sorry 'bout the line breaks...
  1484.  
  1485. Bye from Germany, Norbert
  1486.  
  1487. ---
  1488.  * Origin: STOP READING! You're leaving the MSG-sector (2:241/5300.3)
  1489.  * Tossed by SFToss v1.00b on 92/05/04  15:12:51
  1490.  
  1491. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1492.  
  1493. Conference 4
  1494. Date       05-03-92 21:02:01
  1495. From       Norbert Igl
  1496. To         Trevor Carlsen
  1497. Subject    16550 chip
  1498.  
  1499.  
  1500.  
  1501.  
  1502.  > Does anybody have any Pascal (or assembler) code that will
  1503.  > demonstrate a fool-proof way of determining if the UART is a 16550,
  1504.  > 16450 or 8250?
  1505.  
  1506.   Hmmm... difference between 8250/16450, no.
  1507.  
  1508.   But, here we go....
  1509. -------------------------8<---------------------------------
  1510.  
  1511. Const ComPortText : Array[0..4] of String[12] =
  1512.   (' N/A ','8250/8250B','8250A/16450','16550A','16550N');
  1513.       IIR     = 2;
  1514.       SCRATCH = 7;
  1515. Var   PortAdr : Array[1..4] of Word absolute $40:0;
  1516.  
  1517. function ComPortType(ComX:byte):byte;
  1518.  
  1519. BEGIN
  1520.   ComPortType:=0;
  1521.   if (PortAdr[ComX] =0)
  1522.   or (Port[PortAdr[ComX]+ IIR ] and $30 <> 0)
  1523.      then exit;                                         {No ComPort !}
  1524.   Port[PortAdr[ComX]+ IIR ] := 1;                       {Test: enable FIFO}
  1525.   if (Port[PortAdr[ComX]+IIR] and $C0) = $C0            {enabled ?}
  1526.   then ComPortType := 3
  1527.   else If (Port[PortAdr[ComX]+IIR] and $80) = $80       {16550,old version..}
  1528.        then ComPortType := 4
  1529.        else begin
  1530.        Port[Portadr[ComX]+SCRATCH]:=$AA;
  1531.        if Port [Portadr[ComX]+SCRATCH]=$AA              {w/ scratch reg. ?}
  1532.            then ComPortType:= 2
  1533.            else ComPortType:= 1;
  1534.        end;
  1535. END;
  1536.  
  1537. { ...test...}
  1538. var com : byte;
  1539. begin
  1540.   writeln('COMPORT-CHIPTEST                 Norbert Igl,2:241/5300.3');
  1541.   for com := 1 to 4 do
  1542.     writeln(' Com',com,' chip type : ',ComPortText[ComPortType(com)]);
  1543. end.
  1544.  
  1545. ------------------------->8---------------------------------
  1546. Bye from Germany, Norbert
  1547.  
  1548. ---
  1549.  * Origin:  i486SX not found! Use Co-processor instead? (2:241/5300.3)
  1550.  * Tossed by SFToss v1.00b on 92/05/04  15:12:51
  1551.  
  1552. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1553.  
  1554. Conference 4
  1555. Date       05-04-92 09:36:36
  1556. From       Trevor Carlsen
  1557. To         Jud Mccranie
  1558. Subject    Re: Features Lacking In T
  1559.  
  1560.  
  1561.  
  1562.  TC> consumer legislation that allows you to return the product for
  1563.  TC> refund if it does not stand up to claims or is unsuitable for
  1564.  TC> the use it is intended for.
  1565.  
  1566.  JM> I think here it is a little different.  You can get a refund
  1567.  JM> if it doesn't live upto claims, but if it is unsuitable that
  1568.  JM> may be your tough luck if it works as advertised.  Some
  1569.  JM> companies are a little nicer and will allow you to return
  1570.  JM> within 30 days for whatever reason.
  1571.  
  1572. I think that yours is similar to here.  By unsuitable for the use for which
  1573. it is intended, it means the use the vendor intended.  So in Turbo Pascal's
  1574. case, if it would not correctly compile Turbo Pascal source code to a correctly
  1575. working executable.
  1576.  
  1577. You might say that "works as advertised" is the same thing. Not so.  eg. 
  1578. I once bought a compiler that worked as advertised but the advertisement omitted
  1579. to say that the compiler would sometimes produce different output for source
  1580. code that was identical except for comments.  Nor was this possibility covered
  1581. in the documentation.  In other words a serious bug. (In fact it cost me thousan
  1582. s of dollars on the contract I had at the time.)  That compiler was unsuitable
  1583. for the job that it was intended to be used for - general purpose programming.
  1584.  
  1585. TeeCee
  1586.  
  1587. --- TC-ED   v2.01  
  1588.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  1589.  * Tossed by SFToss v1.00b on 92/05/04  15:12:56
  1590.  
  1591. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1592.  
  1593. Conference 4
  1594. Date       05-03-92 16:47:44
  1595. From       Dj Murdoch
  1596. To         Derek Mahar
  1597. Subject    Re: Pointers as function results (was: P
  1598.  
  1599.   DM> Are constructors in Pascal automatically executed when an 
  1600.  DM> object is declared? What is the purpose of a constructor 
  1601.  DM> besides initializing fields?
  1602.  
  1603. Constructors aren't in standard Pascal; the only object Pascal I know anything
  1604. about is Turbo Pascal (though there are others), so I'll answer your questions
  1605. with regard to it.
  1606.  
  1607. Constructors are never executed automatically.  You have to explicitly call
  1608. them, either when a dynamic object is allocated, e.g.
  1609.  
  1610.   New(Myobjptr, init);
  1611.  
  1612. or afterwards, e.g.
  1613.  
  1614.   New(Myobjptr);
  1615.   Myobjptr^.init;   
  1616.  
  1617. These two fragments are equivalent.
  1618.  
  1619. As far as the compiler is concerned, the only things that are special about
  1620. a constructor are:
  1621.  
  1622.    1.   You're allowed to use that special New syntax to call it.
  1623.    2.   In its prologue, it initializes the pointer to the virtual method
  1624. table for the object; if that's not done, virtual methods can't be called
  1625. correctly.  (You can override this behaviour if you need to.)
  1626.  
  1627. I think a good general style is to put any initialization code into the construc
  1628. or, too.
  1629.  
  1630.  DM> When are destructors executed?
  1631.  
  1632. Again, only when you explicitly ask them to be.  The usual ways to call a
  1633. destructor are
  1634.  
  1635.   dispose(myobjptr, done);    { Calls myobjptr^.done before disposing }
  1636.  
  1637. or, in a destructor's code,
  1638.  
  1639.   TParent.done;
  1640.  
  1641. I've only ever needed to have one destructor per object type, and I follow
  1642. the convention of calling it "Done", but the compiler doesn't care how many
  1643. you have.
  1644.  
  1645.  
  1646. --- Msg V3.2
  1647.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1648.  * Tossed by SFToss v1.00b on 92/05/05  07:59:28
  1649.  
  1650. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1651.  
  1652. Conference 4
  1653. Date       05-03-92 16:59:23
  1654. From       Dj Murdoch
  1655. To         Keith Dombrowski
  1656. Subject    Re: EMS w/Overlays
  1657.  
  1658.   KD>    Well, actualy it never happens in the IDE, but the 
  1659.  KD> second one may be the ticket, the door library I am using 
  1660.  KD> has it's own exit procedure and as I don;t have the 
  1661.  KD> source, I can't tell if it is executing the default one. 
  1662.  KD> Thanks for the info, I'll have to send the author a netmail about it.
  1663.  
  1664. Here's an easy way to tell:  create an exit procedure that prints a message
  1665. and then calls the old one.  Be sure it gets installed before the door library's
  1666. (by putting the unit first in the Uses list), and then see if the message
  1667. comes out.  If not, try putting it last in the Uses list, just to be sure
  1668. that it's not your mistake.
  1669.  
  1670. --- Msg V3.2
  1671.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1672.  * Tossed by SFToss v1.00b on 92/05/05  07:59:28
  1673.  
  1674. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1675.  
  1676. Conference 4
  1677. Date       05-03-92 17:03:13
  1678. From       Dj Murdoch
  1679. To         Jud Mccranie
  1680. Subject    Re: Features Lacking In Tp
  1681.  
  1682.   DM> I don't see any need for static data greater than 64K, but I'd
  1683.  
  1684.  JM> Well, it is much easier and faster if you have data available in memory,
  1685.  JM> and if you have more than 64K of it, you need more than 64K.
  1686.  
  1687. I really don't see that you've got any reason to believe it would be faster.
  1688.  If you've got more than 64K of static data, the compiler is going to have
  1689. to fiddle around with multiple segments to get at it.  It can probably do
  1690. it a little better than you can, but not a lot.
  1691.  
  1692. --- Msg V3.2
  1693.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1694.  * Tossed by SFToss v1.00b on 92/05/05  07:59:28
  1695.  
  1696. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1697.  
  1698. Conference 4
  1699. Date       05-03-92 17:39:11
  1700. From       Dj Murdoch
  1701. To         J J Marquez
  1702. Subject    Re: dectecing coprocessor
  1703.  
  1704.   JJ>   That's like dialing a number, NOT getting a ring, and 
  1705.  JJ> having the phone company say "Well, you never SAID 
  1706.  JJ> anything, how do you KNOW the call wasn't completed ?". 
  1707.  JJ> Inclusion and use of the TEST8087 item in a user program 
  1708.  JJ> ought to work, even if you do nothing else. Or, AT LEAST 
  1709.  JJ> have the docs clearly tell you that it won't work without 
  1710.  JJ> the other code present.
  1711.  
  1712. One fix could be to make TEST8087 into a function, instead of a variable.
  1713.  If it was in the fpu code block, it would always pull in the detector code
  1714. when you called it.
  1715.  
  1716. Another would be to pull TEST8087 out of the single block of SYSTEM constants,
  1717. and to put it in a different block of constants, which also contained a pointer
  1718. to some fpu code.
  1719.  
  1720. Both of these would break existing code (e.g. my CLEARMEM unit), but only
  1721. if the code was doing things it shouldn't do.  (CLEARMEM's Clear_Globals procedu
  1722. e is very version dependent.)  I'd prefer a note in the doc's, rather than
  1723. either of the changes I suggested.  Both would add unnecessary overhead.
  1724.  
  1725.  
  1726. --- Msg V3.2
  1727.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1728.  * Tossed by SFToss v1.00b on 92/05/05  07:59:29
  1729.  
  1730. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1731.  
  1732. Conference 4
  1733. Date       05-03-92 17:47:50
  1734. From       Dj Murdoch
  1735. To         Chris Whitney
  1736. Subject    Re: MOVEing files vs. co
  1737.  
  1738.   CW>  I've had problems with this procedure (in TP 6)  It gives me error 103
  1739.  CW> I think.. REALLY annoying to have to shell to dos and 'REN' it.. I even
  1740.  CW> tried using an assembly version of it in TP and got the same error..
  1741.  CW> path not found.  One strange thing is that I put a space in the quote
  1742.  CW> before it and it worked, and another time that it worked it took off the
  1743.  
  1744.  CW> first character!  Do you have to put a '.\' or something in it to work
  1745.  CW> properly?  BTW: I'm trying to rename a file in the same directory
  1746.  CW> REN FILE1.TXT FILE2.TXT <- like that in dos.
  1747.  
  1748. I haven't had problems.  Could you post the code that doesn't work?  
  1749.  
  1750. --- Msg V3.2
  1751.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1752.  * Tossed by SFToss v1.00b on 92/05/05  07:59:29
  1753.  
  1754. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1755.  
  1756. Conference 4
  1757. Date       05-03-92 17:49:52
  1758. From       Dj Murdoch
  1759. To         Roger Joelsson
  1760. Subject    Re: Complex calculating in Pascal
  1761.  
  1762.   RJ> I'm working on a way to handle complex expressions in 
  1763.  RJ> Pascal. I've thought of many ways of doing it, but I think 
  1764.  RJ> defining a RECORD containing a Real variable for the real 
  1765.  RJ> part of the expression and aother Real variable containing 
  1766.  RJ> the imaginary part.
  1767.  RJ> That would be something like:
  1768.  
  1769.  RJ>   Expr.Re  :=  4;      (* real *)
  1770.  RJ>   Expr.Cx  :=  2;      (* imaginary *)
  1771.  
  1772.  RJ> This would mean
  1773.  RJ>  4 + 2i
  1774.  
  1775.  RJ> Is this the right way of implementing this, are any other ways?
  1776.  RJ> Would be glad to hear a little from you about this..:-)
  1777.  
  1778. That's the most straightforward way.  The only problem is that functions can't
  1779. return records, so you have to do all your calculations in procedures with
  1780. Var parameters.  A very clever way around this that Terry Ritter showed to
  1781. me is something like the following:
  1782.  
  1783.  Type 
  1784.    Float = double;         { Or use Float = real if you like. }
  1785.  
  1786.    Tcomplex = string[2*sizeof(Float)];  
  1787.    { This is the type that you declare variables to be }
  1788.  
  1789.    Tcomplex2 = record  { This is the type used internally }
  1790.      lenbyte : byte;       { This byte should always be set to 2*sizeof(Float) 
  1791.  
  1792.      Re, Im  : float;
  1793.    end;
  1794.    Now you can have functions that take Tcomplex arguments and return Tcomplex
  1795. values.  Internally, they typecast arguments to Tcomplex2 to work with them.
  1796.  
  1797. For example,
  1798.  
  1799.   Function Complex(Realpart,Imagpart:Float):TComplex;  { Make a complex number. }
  1800.  
  1801.   var
  1802.     result : TComplex2;
  1803.   begin
  1804.     with result do
  1805.     begin
  1806.       lenbyte := 2*sizeof(Float);    { Essential! }
  1807.       re := realpart;
  1808.       im := imagpart;
  1809.     end; 
  1810.     Complex := TComplex(result);
  1811.   end;            
  1812.  
  1813.   Function CMul(x,y:TComplex):TComplex;  { Multiply two complex numbers. }
  1814.   var
  1815.     result : TComplex2;
  1816.     x2 : TComplex2 absolute x;  { This is one way to do a typecast }
  1817.     y2 : Tcomplex2 absolute y;  
  1818.   begin
  1819.     CMul := Complex( x2.Re*y2.Re - x2.Im*y2.Im,
  1820.                      x2.Re*y2.Im + x2.Im*y2.Re);
  1821.   end;
  1822.  
  1823.  
  1824. Then you can figure out (1+3i)*(5-5i) by the expression:
  1825.  
  1826.   result := CMul(Complex(1,3),Complex(5,-5));
  1827.  
  1828. I haven't tested this code; it probably has some errors, but should give you
  1829. the idea. 
  1830.  
  1831. --- Msg V3.2
  1832.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1833.  * Tossed by SFToss v1.00b on 92/05/05  07:59:29
  1834.  
  1835. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1836.  
  1837. Conference 4
  1838. Date       05-03-92 18:03:47
  1839. From       Dj Murdoch
  1840. To         Sean Ocker
  1841. Subject    Re: COM instead of EXE
  1842.  
  1843.   SO> Hello.  I am not dumb, I have tried to use the DOS 5.0 EXE2BIN to
  1844.  SO> do this, but need to know how to make a COM file instead of an
  1845.  SO> EXE when compiling.  Is there no hope if DOS won't do it?
  1846.  
  1847. TP (versions 4+) can't produce executables that will work in COM format. 
  1848. There are utilities that supposedly correct this (though I have my doubts).
  1849.  The simplest solution is just to give up on getting a COM format, and be
  1850. satisfied with a .COM extension:
  1851.  
  1852.   rename myprog.exe myprog.com
  1853.  
  1854. There are almost no places where you really need COM format anyways, in DOS 3+.
  1855.  
  1856.  
  1857. --- Msg V3.2
  1858.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1859.  * Tossed by SFToss v1.00b on 92/05/05  07:59:29
  1860.  
  1861. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1862.  
  1863. Conference 4
  1864. Date       05-03-92 21:06:21
  1865. From       Dj Murdoch
  1866. To         All
  1867. Subject    TP 6.0 bug list (release 6)
  1868.  
  1869.  I've just released the 6th version of my unofficial TP 6.0 bug list.  It's
  1870. gone out as TP6BUGS6.ZIP on the PDN Pascal file echo, and should be available
  1871. on the Internet soon as /pc/turbopas/tp6bugs6.zip on garbo.uwasa.fi, and on
  1872. Compuserve in CLMFORUM DL 16 as TPBUGS.ZIP (watch out for version 5 there,
  1873. with the same name!).
  1874.  
  1875. The current version (which I hope is the last for TP 6.0 - c'mon Borland,
  1876. let's have 7.0!) describes about 75 bugs, and provides 5 fixes.  Most of these
  1877. bugs are *very* obscure, but I've included them for the sake of completeness.
  1878.  The full list is too long to post here now, but I've extracted the 20 new
  1879. entries below.
  1880.  
  1881.  
  1882. ------ Cut here ---------
  1883.  
  1884. If the Objects unit is overlaid, calls to stream or collection Error methods
  1885. can cause system crashes.
  1886.  
  1887. The Drivers unit misses keystrokes if the keyboard buffer has been reallocated.
  1888.  
  1889. Extensions to the Drivers unit INT09 (keyboard interrupt) handler won't work
  1890. when run within the IDE, because the interrupt handler won't be installed.
  1891.  
  1892. A window that has neither the wfGrow now wfMove flags set does not disable
  1893. the cmResize command when it is active.  (A fix is available: see TWindow.fix
  1894. in TP6BUGSn.ZIP).
  1895.  
  1896. The compiler doesn't detect overlapping case constants.  Only the first matching
  1897. case is executed.
  1898.  
  1899. The Delay() routine in CRT gives inaccurate delays on some very fast machines.
  1900. A patch (DELAY.FIX) from Borland is included in TP6BUGSn.ZIP.
  1901.  
  1902. The SetViewPort procedure accepts X1=X2 or Y1=Y2 (contrary to the documentation)
  1903.  but clipping doesn't work properly with these settings.
  1904.  
  1905. TopText, CentreText, and BottomText are defined differently for DefaultFont
  1906. and stroked fonts.
  1907.  
  1908. Single and Double types typed constants are not correctly initialized for
  1909. absolute values smaller than 1.17xxxxE-38 respectively 2.22xxxxE-308 (their
  1910. value wil be zero instead).  The lower limit of the dynamic range should be
  1911. 1.5E-45 and 5.0E-324 respectively.
  1912.  
  1913. App.ISqr enters an endless loop for arguments greater than 32760.
  1914.  
  1915. Graph.SetTextJustify doesn't properly account for descenders; they can be
  1916. clipped at the bottom of the screen.
  1917.  
  1918. BASM has the ranges of legal values incorrect for IN, OUT, INT, ENTER, AAM,
  1919. AAD instructions.
  1920.  
  1921. BASM allows references to nonexistent registers on the coprocessor, e.g. 
  1922. FADD ST, ST(123456)
  1923.  
  1924. The IDE doesn't properly single step across AAM xx and AAD xx instructions.
  1925.  
  1926. BASM doesn't do proper checking on CALLs and JMPs to near/far procedures or
  1927. absolute variables, and sometimes doesn't generate proper code, e.g.
  1928.  JMP FAR PTR AbsoluteVariable    { AbsoluteVariable is declared absolutely }
  1929.  
  1930.  CALL FAR PTR AbsoluteVariable
  1931.  
  1932. BASM doesn't flag the statements
  1933.   MOV AX, [WORD]
  1934.   MOV BYTE PTR AL,5 as nonsense.
  1935.  
  1936. The coprocessor emulator doesn't handle special arguments like INF and NaN
  1937. properly.  Quiet NaNs are treated as signalling NaNs, and operations on INF
  1938. return NaN.
  1939.  
  1940. The Random function will return 1.0 once every 2^32 calls in $N+ mode.  This
  1941. value should be folded to 0.0, so that Trunc(N*Random) can't return N.
  1942.  
  1943. TRect.Union and TRect.Intersect don't perform set operations.  If two rectangles
  1944. don't intersect, TRect.Intersect always returns ((0,0),(0,0)); the union of
  1945. that empty rectangle with any other rectangle always includes the point (0,0).
  1946.  
  1947. The Str procedure rounds nnn.5 differently than either the Round or Trunc
  1948. functions when printing reals with no decimal places.  In $N- mode, it is
  1949. inconsistent; in $N+ mode, it consistently rounds up. 
  1950.  
  1951. --- Msg V3.2
  1952.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  1953.  * Tossed by SFToss v1.00b on 92/05/05  07:59:29
  1954.  
  1955. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1956.  
  1957. Conference 4
  1958. Date       05-05-92 00:48:28
  1959. From       Trevor Carlsen
  1960. To         Jose Campione
  1961. Subject    NEED SOME HELP
  1962.  
  1963.  
  1964.  
  1965.  JC> The following little example allows toggling of the three keys in any 
  1966.  
  1967.  JC> combination. Hope it's useful:
  1968.  
  1969.  JC>         if key and bit = bit then key:= key xor bit
  1970.  JC>                              else key:= key + bit;
  1971.  
  1972. As you are trying to toggle the appropriate bit the else is redundant.  Just
  1973.    key := key xor bit;
  1974. is all that is required.
  1975.  
  1976. TeeCee
  1977.  
  1978.  
  1979.  
  1980. --- TC-ED   v2.01  
  1981.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  1982.  * Tossed by SFToss v1.00b on 92/05/05  18:47:04
  1983.  
  1984. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1985.  
  1986. Conference 4
  1987. Date       05-05-92 01:16:01
  1988. From       Trevor Carlsen
  1989. To         Benjamin Schollnick
  1990. Subject    Re: Procedures...
  1991.  
  1992.  
  1993.  
  1994.  BS>         Repeat
  1995.  BS>         Until True = False;
  1996.  
  1997.  TC> That is a perfectly valid technique.  I use it frequently
  1998.  TC> in input loops where it can make the code cleaner and more
  1999.  TC> readable. Usually I add a comment like - { halt occurs in
  2000.  TC> procedure ProcessInput if escape key pressed }
  2001.  
  2002.  BS> Tc, I guess it's just my "UNCONVENTIAL" thinking here....(Or
  2003.  BS> me just complaining, which I do sometimes)....But my logic
  2004.  BS> is that there is NO WAY OUT OF THAT LOOP UNLESS YOU EXIT....
  2005.  
  2006. The whole point of such a loop is that there should be no way out. The program
  2007. can thus only be halted from the procedure in which the halt statement is
  2008. used. If you don't like this style, that's fine.  Everyone to their own :-)
  2009.  
  2010. TeeCee
  2011.  
  2012. --- TC-ED   v2.01  
  2013.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2014.  * Tossed by SFToss v1.00b on 92/05/05  18:47:04
  2015.  
  2016. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2017.  
  2018. Conference 4
  2019. Date       05-05-92 01:20:02
  2020. From       Trevor Carlsen
  2021. To         David G. Edwards
  2022. Subject    Re: Features Lacking In Tp
  2023.  
  2024.  
  2025.  
  2026.  DG> I doubt that you've ever been bitten by using an uninit'd pointer or 
  2027.  
  2028.  DG> forgotten to dispose of something, but I have...
  2029.  
  2030. Oh for that to be true!  (It does not happen so frequently now though - especial
  2031. y as my TCLint source checker continues to develop nicely!)
  2032.  
  2033. TeeCee
  2034.  
  2035.  
  2036. --- TC-ED   v2.01  
  2037.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2038.  * Tossed by SFToss v1.00b on 92/05/05  18:47:04
  2039.  
  2040. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2041.  
  2042. Conference 4
  2043. Date       05-04-92 21:14:16
  2044. From       Dj Murdoch
  2045. To         John Gohde
  2046. Subject    Re: A Virtuous Pascal ...
  2047.  
  2048.   JG> POINT TWO: There  is a market for a simple  and stable real world
  2049.  JG> version  of   Pascal.  And,  this  market   segment  consists  of
  2050.  JG> educational institutions, students of  programming under 18 years
  2051.  JG> of  age,  and  long  term  casual  programmers  in  general. And,
  2052.  JG> Stability  of  a  module  format  would  be  as  much a virtue as
  2053.  JG> simplicity  would  be  in  regards   to  promoting  Pascal  as  a
  2054.  JG> programming language.
  2055.  
  2056. I'm not sure what you mean by "real world" version of Pascal, but I think
  2057. you're right that a lot of academics don't like Turbo Pascal.  I've recently
  2058. had it explained to me by a couple of people teaching first year university
  2059. courses in programming:
  2060.  
  2061. TP is a terrible language to use for that purpose.  It's not stable, it's
  2062. not simple, it's not Pascal, it's not portable.
  2063.  
  2064. Their ideal language would be a faithful implementation of standard Pascal,
  2065. without a lot of language extensions to confuse students.  I think they'd
  2066. prefer no modules at all, since standard Pascal doesn't have them.
  2067.  
  2068. I've never taught programming, but I sure wouldn't want to be a student in
  2069. a course as these people describe it.  Standard Pascal is, in my opinion,
  2070. a far inferior language to Turbo Pascal. (At least one of the academics I
  2071. was talking to agreed with this, but didn't see that a first programming course
  2072. should teach a useful language.)
  2073.  
  2074.  
  2075. --- Msg V3.2
  2076.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2077.  * Tossed by SFToss v1.00b on 92/05/06  10:37:45
  2078.  
  2079. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2080.  
  2081. Conference 4
  2082. Date       05-04-92 21:25:27
  2083. From       Dj Murdoch
  2084. To         Matt Heck
  2085. Subject    Re: Cyrix Coprocessor
  2086.  
  2087.   MH> Any difference between the 486 internal math routines and the 387's?
  2088.  
  2089. Very little.  According to Intel's 486 Programmer's Reference Manual:
  2090.  
  2091. The CR0 control register bits dealing with the FPU are different in the 486
  2092. than the 386; there are differences upon hardware reset; some exceptions occur
  2093. slightly differently. 
  2094.  
  2095. The one worrisome one is the last one, which I'll quote:
  2096.  
  2097. "On the i486 processor, transcendental instructions can be aborted at certain
  2098. checkpoints during execution if an INTR is pending.  Transcendental instructions
  2099. should there be used only in an environment where INTRs are not expected to
  2100. come as close as 200 clocks apart."
  2101.  
  2102. I really don't see how you can have any control over this:  if you're running
  2103. interrupt driven I/O, you'll get lots of interrupts; you'll always get timer
  2104. ticks; you can also get interrupts from the mouse, the disks, etc.  How are
  2105. you supposed to know if interrupts aren't going to come as close as 200 clocks
  2106. apart !?!
  2107.  
  2108. Perhaps I'm misinterpreting this paragraph.
  2109.  
  2110. --- Msg V3.2
  2111.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2112.  * Tossed by SFToss v1.00b on 92/05/06  10:37:45
  2113.  
  2114. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2115.  
  2116. Conference 4
  2117. Date       05-04-92 22:14:03
  2118. From       Dj Murdoch
  2119. To         Greg Smith
  2120. Subject    Re: Sbp+
  2121.  
  2122.   GS> By ALL memory models I assume they mean all Real Mode memory models.
  2123.  GS> This being the case, yes the 64k limit would exist.  The processor
  2124.  GS> limits us to this.  Please correct me if I'm wrong here.
  2125.  
  2126. Most current compilers other than TP have some sort of "huge" structures,
  2127. which are bigger than 64K.  These are handled in real mode by doing arithmetic
  2128. on the segment registers.  For example, the line 
  2129.  
  2130.   x[i] := 5;
  2131.  
  2132. where x is an array of 10 integers in TP compiles to 
  2133.  
  2134.   0000:0015 8B3E5800        MOV     DI,[I]
  2135.   0000:0019 D1E7            SHL     DI,1
  2136.   0000:001B C78542000500    MOV     [WORD PTR DI+0042h],0005h
  2137.  
  2138. while the MS Fortran line
  2139.  
  2140.   x(i) = 5
  2141.  
  2142. with x declared to be an array of 50000 integers compiles to
  2143.  
  2144.   0000:000C B89E86          MOV     AX,869Eh
  2145.   0000:000F 99              CWD
  2146.   0000:0010 050000          ADD     AX,0000h
  2147.   0000:0013 83D200          ADC     DX,+00h
  2148.   0000:0016 B90C00          MOV     CX,000Ch
  2149.   0000:0019 D3E2            SHL     DX,CL
  2150.   0000:001B 81C24903        ADD     DX,0349h
  2151.   0000:001F 8EC2            MOV     ES,DX
  2152.   0000:0021 8BD8            MOV     BX,AX
  2153.   0000:0023 26C7070500      MOV     [ES: WORD PTR BX],0005h
  2154.  
  2155. As you can see, huge arrays carry a lot of overhead, but they do really help
  2156. sometimes.
  2157.  
  2158. --- Msg V3.2
  2159.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2160.  * Tossed by SFToss v1.00b on 92/05/06  10:37:46
  2161.  
  2162. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2163.  
  2164. Conference 4
  2165. Date       05-05-92 07:55:09
  2166. From       Dj Murdoch
  2167. To         All
  2168. Subject    Standard I/O in TP?
  2169.  
  2170.  I remember a couple of years ago Charles Falconer announced here that he had
  2171. put together a TP unit to act as a substitute for TP's lack of standard Pascal
  2172. file I/O - the one character lookahead, etc.
  2173.  
  2174. Does anyone have a copy or know where I could find one?  If not, does anyone
  2175. know of a way to contact Charles?
  2176.  
  2177. --- Msg V3.2
  2178.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2179.  * Tossed by SFToss v1.00b on 92/05/06  10:37:46
  2180.  
  2181. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2182.  
  2183. Conference 4
  2184. Date       05-05-92 18:35:44
  2185. From       Dj Murdoch
  2186. To         Basil Groman
  2187. Subject    Re: COM instead of EXE
  2188.  
  2189.   BG> TP 3.0 will but not TP 4.0+.  To create a com file the 
  2190.  BG> program would have to be compiled in the Tiny memory model 
  2191.  BG> (code+data <= 64k AND all in one segment) Starting with TP 
  2192.  BG> 4.0, TP uses a single data segment and 1 or more code segments.
  2193.  
  2194.  > Just wanna know,
  2195.  
  2196.  BG> Just hope I was right. :)  I'm sure that if I'm wrong 
  2197.  BG> somebody will be kind enough to inform me.
  2198.  
  2199. I always try to be kind:  all TP 4+ versions always use at least 2 code segments
  2200.  one each for the main program and the System unit.
  2201.  
  2202. --- Msg V3.2
  2203.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2204.  * Tossed by SFToss v1.00b on 92/05/06  10:37:46
  2205.  
  2206. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2207.  
  2208. Conference 4
  2209. Date       05-05-92 18:39:03
  2210. From       Dj Murdoch
  2211. To         All
  2212. Subject    TP on an HP calculator?
  2213.  
  2214.  HP has a calculator (called the HP 95 LX, I think) which is a little DOS machine.
  2215.  You can buy programs on ROM cards.  Does anyone know if TP is available that way, 
  2216.  
  2217.  
  2218. --- Msg V3.2
  2219.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2220.  * Tossed by SFToss v1.00b on 92/05/06  10:37:46
  2221.  
  2222. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2223.  
  2224. Conference 4
  2225. Date       05-05-92 18:43:02
  2226. From       Dj Murdoch
  2227. To         Gerald Gutierrez
  2228. Subject    Re: LZW ? / Bit shifting ??
  2229.  
  2230.   GG> Oh yes... Question #2. Does anyone have a type of 
  2231.  GG> procedure which will take
  2232.  GG> in a pointer to an array of bytes, then shift their bits 
  2233.  GG> left or right a number of 'spaces' ?? I mean this in the 
  2234.  GG> format of the procedure as something like:
  2235.  ...
  2236.  GG>   A := #15#15#15#15#15;
  2237.  GG>        { 00001111 00001111 00001111 00001111 00001111 }
  2238.  
  2239.  GG>   After executing ShiftBits ( @A, 33, 2 );
  2240.  GG>    -- move a max of 33 *BITS*
  2241.  
  2242.  GG>   A  = #14#195#195#195#195#195;
  2243.  GG>        { 00001110 01000011 11000011 11000011 11000011 }
  2244.  
  2245. I have some general routines for bit operations.  They're part of my Streams
  2246. unit (the unreleased part!).  The idea would be to treat A as a stream of
  2247. bits, then copy 33 bits of it to another stream of bits.  You'd get the shift
  2248. by skipping some or adding some zeros.
  2249.  
  2250.  
  2251.  
  2252. --- Msg V3.2
  2253.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2254.  * Tossed by SFToss v1.00b on 92/05/06  10:37:46
  2255.  
  2256. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2257.  
  2258. Conference 4
  2259. Date       05-06-92 02:13:53
  2260. From       Trevor Carlsen
  2261. To         Gordon Tackett
  2262. Subject    16550 chip
  2263.  
  2264.  
  2265.  
  2266.  GT> BTW I though you had Async Pro? is there a problem with there code for 
  2267.  
  2268.  GT> this function?
  2269.  
  2270. Yeah...and I never gave it a thought! :-(  Needless to say all I required
  2271. was in there.  Thanks to all who helped.
  2272.  
  2273. TeeCee
  2274.  
  2275. --- TC-ED   v2.01  
  2276.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2277.  * Tossed by SFToss v1.00b on 92/05/06  22:07:36
  2278.  
  2279. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2280.  
  2281. Conference 4
  2282. Date       05-06-92 02:24:18
  2283. From       Trevor Carlsen
  2284. To         Shelby Crane
  2285. Subject    Re: $80?
  2286.  
  2287.  
  2288.  
  2289.  SC> Well, I just bought Tom Swan's Mastering Turbo Pascal 6.0
  2290.  SC> but I can't find a list of the $thingas... I did find that
  2291.  SC> $01 was escape and $02 was 1... haha...do you have a program
  2292.  SC> what will list these or whatever?
  2293.  
  2294. The full list of scan codes for all the keys is on page 354 of the TP6 Programme
  2295. 's guide.
  2296.  
  2297. TeeCee
  2298.  
  2299. --- TC-ED   v2.01  
  2300.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2301.  * Tossed by SFToss v1.00b on 92/05/06  22:07:36
  2302.  
  2303. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2304.  
  2305. Conference 4
  2306. Date       05-06-92 02:33:06
  2307. From       Trevor Carlsen
  2308. To         Robert Johnston
  2309. Subject    Error Levels
  2310.  
  2311.  
  2312.  
  2313.  SC> How does a TP program read an errorlevel out of a program it just
  2314.  SC> shelled to?
  2315.  
  2316.  RJ>         Check the DosExitCode like...
  2317.  
  2318.  RJ> Procedure Checkit;
  2319.  RJ> Begin
  2320.  RJ>   Exec(GetEnv('COMSPEC'),'/C ERROR.EXE');
  2321.  RJ>   Case DosExitCode of
  2322.  RJ>   1 :
  2323.  RJ>     Begin
  2324.  RJ>       Writeln('Error level 1 passed from program');
  2325.  RJ>       Halt;
  2326.  RJ>     End;
  2327.  RJ>   2 : Exit;
  2328.  RJ>   End;
  2329.  RJ> End;
  2330.  
  2331. This will not work.  To prove it to yourself, write a program error.exe that
  2332. always returns errorlevel 1 on termination.  The message indicating this will
  2333. never be printed by the above program.
  2334.  
  2335. This is because the errorlevel you are checking with DosExitCode is that which
  2336. is being returned by the command interpreter and not error.exe.
  2337.  
  2338. To get error.exe's exitcode you must execute it as a direct child process
  2339. and not by the command processor.
  2340.  
  2341. TeeCee
  2342.  
  2343. --- TC-ED   v2.01  
  2344.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2345.  * Tossed by SFToss v1.00b on 92/05/06  22:07:36
  2346.  
  2347. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2348.  
  2349. Conference 4
  2350. Date       05-06-92 14:00:24
  2351. From       Trevor Carlsen
  2352. To         daniel prosser
  2353. Subject    printing (to screen) an ANSI array
  2354.  
  2355.  
  2356.  
  2357.  > The way I get around this without turning directvideo off(False) is:
  2358.  > Assign(OutPut,'') ;
  2359.  > Rewrite(OutPut) ;
  2360.  
  2361.  > Seems to work for me. Just include it at the beginning of your
  2362.  > program.
  2363.  
  2364.  dp> Nah I prefer just directvideo := false; much neater, your way would
  2365.  dp> probably be more portable, but when using pascal portability isn't
  2366.  dp> really an issue.
  2367.  
  2368. Trouble is, setting DirectVideo to false will not achieve the desired result.
  2369.  In order to permit redirection and ansi code interpretation, screen writes
  2370. MUST be routed through DOS.  DirectVideo := false does not do that, it merely
  2371. routes writes through the BIOS and hence will not work. 
  2372.  
  2373.  
  2374. TeeCee
  2375.  
  2376. --- TC-ED   v2.01  
  2377.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2378.  * Tossed by SFToss v1.00b on 92/05/06  22:07:36
  2379.  
  2380. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2381.  
  2382. Conference 4
  2383. Date       05-06-92 14:08:06
  2384. From       Trevor Carlsen
  2385. To         geoff watts
  2386. Subject    virus
  2387.  
  2388.  
  2389.  
  2390.  JB> Thing I think is terribly fascinating is why haven't
  2391.  JB> someone come up with a practical usage for the viruses
  2392.  JB> yet..
  2393. .. 
  2394.  gw> 6) Talking about them gets you kicked out of the echo :-)
  2395.  
  2396. No it won't... talking about them in terms of how to create, possible methods
  2397. to use and/or distribute them will, or outside the scope of this conference,
  2398. which is the Pascal language, will.
  2399.  
  2400. Generally speaking the subject is better left alone because as soon as it
  2401. is raised some idiot has to join the thread in a irresponsible way.  Therefore
  2402. please drop it and don't resurrect it.
  2403.  
  2404. Trevor Carlsen
  2405. Moderator.
  2406.  
  2407. --- TC-ED   v2.01  
  2408.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2409.  * Tossed by SFToss v1.00b on 92/05/06  22:07:36
  2410.  
  2411. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2412.  
  2413. Conference 4
  2414. Date       05-06-92 08:23:44
  2415. From       Dj Murdoch
  2416. To         Robert Johnston
  2417. Subject    Re: Turbo .EXE
  2418.  
  2419.   RJ> Ok... Question...  Sometimes, when I type out OVR files or EXE files (a
  2420.  RJ> good example is TYPE TURBO.HLP ... I went in and hex viewied it with
  2421.  RJ> norton utils and saw at the beginning
  2422.  
  2423.  RJ> TURBO PASCAL HELP FILE. >       ( > is the EOF marker to end TYPE )
  2424.  
  2425.  RJ> how would i compile the source to make the first few bytes BE that text.
  2426.  RJ> Thanks!
  2427.  
  2428. You can't make the first two bytes of an .EXE anything but MZ, or it won't
  2429. load.  However, you could probably patch an .EXE so that it had your label
  2430. after the header, with a bunch of backspaces first to cover up whatever junk
  2431. you didn't want showing.  TP can't produce an .EXE like that, though.  If
  2432. you want to see where to put your message, take a look at any .EXE produced
  2433. by PKLITE - they stick a copyright notice in near the beginning.  They don't
  2434. bother with the backspaces or the ^Z, though.
  2435.  
  2436. --- Msg V3.2
  2437.  * Origin: Murdoch's Point: Waterloo, Ontario, Canada (1:221/177.40)
  2438.  * Tossed by SFToss v1.00b on 92/05/07  08:05:45
  2439.  
  2440. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2441.  
  2442. Conference 4
  2443. Date       05-07-92 01:18:20
  2444. From       Trevor Carlsen
  2445. To         Max Maischein
  2446. Subject    16550 chip
  2447.  
  2448.  
  2449.  
  2450.  MM> DDJ April 1991 , I think.
  2451.  MM> Jeff Duntemans column. But I'm not sure. He talked about UARTs,
  2452.  MM> and their bugs. In DDJ March or April 1992, there was a readers note 
  2453.  
  2454.  MM> about it.
  2455.  
  2456. Thanks... I discovered that the information I needed was already available
  2457. to me in TPAsync.
  2458.  
  2459.  MM> PS: Got my NetMail ?
  2460.  
  2461. No...try again.  (My old machine went down for the count on April 23 and I
  2462. lost a couple of days of unread mail.)
  2463.  
  2464. TeeCee
  2465.  
  2466.  
  2467. --- TC-ED   v2.01  
  2468.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2469.  * Tossed by SFToss v1.00b on 92/05/08  19:35:22
  2470.  
  2471. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2472.  
  2473. Conference 4
  2474. Date       05-07-92 01:30:58
  2475. From       Trevor Carlsen
  2476. To         Dj Murdoch
  2477. Subject    Standard I/O in TP?
  2478.  
  2479.  
  2480.  
  2481.  DM> Does anyone have a copy or know where I could find one?  If not, does 
  2482.  
  2483.  DM> anyone know of a way to contact Charles?
  2484.  
  2485. No to both questions.  When CF originally went AWOL from the echo and someone
  2486. reported that he had suffered a catastrophic HD crash and had no funds for
  2487. a new one, I repeatedly tried to call his last known telephone number -
  2488. 203 281 1438, as I wanted to get him back into the echo action quickly.  I
  2489. have been unable to make contact at all and I have no address.
  2490.  
  2491. TeeCee
  2492.  
  2493. --- TC-ED   v2.01  
  2494.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2495.  * Tossed by SFToss v1.00b on 92/05/08  19:35:22
  2496.  
  2497. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2498.  
  2499. Conference 4
  2500. Date       05-07-92 17:29:00
  2501. From       Trevor Carlsen
  2502. To         Dj Murdoch
  2503. Subject    Re: A Virtuous Pascal ...
  2504.  
  2505.  
  2506.  
  2507.  DM> Their ideal language would be a faithful implementation of standard 
  2508.  DM> Pascal, without a lot of language extensions to confuse students.  I 
  2509.  
  2510.  DM> think they'd prefer no modules at all, since standard Pascal doesn't 
  2511.  
  2512.  DM> have them.
  2513.  
  2514.  DM> I've never taught programming, but I sure wouldn't want to be a 
  2515.  DM> student in a course as these people describe it.  Standard Pascal is, 
  2516.  
  2517.  DM> in my opinion, a far inferior language to Turbo Pascal. (At least one 
  2518.  
  2519.  DM> of the academics I was talking to agreed with this, but didn't see 
  2520.  DM> that a first programming course should teach a useful language.)
  2521.  
  2522. If you think about it, that is probably reasonable thinking.
  2523.  
  2524. As a teaching aid, Standard (Wirth) Pascal would be superb. Anybody able to
  2525. produce useful work with it would easily move on and adapt to the real world,
  2526. whether it be using TP, C or any other modern HLL and GPP would have been
  2527. learnt and (hopefully) understood.
  2528.  
  2529. TeeCee
  2530.  
  2531. --- TC-ED   v2.01  
  2532.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2533.  * Tossed by SFToss v1.00b on 92/05/08  19:35:22
  2534.  
  2535. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2536.  
  2537. Conference 4
  2538. Date       05-08-92 01:07:21
  2539. From       Trevor Carlsen
  2540. To         David G. Edwards
  2541. Subject    Re: Procedures...
  2542.  
  2543.  
  2544.  
  2545.  DG> I was badly burned one time when I added some features to someone 
  2546.  DG> else's code, but overlooked the fact that he had hidden a couple of 
  2547.  DG> "halts" in some units.  The code I added needed a few lines of 
  2548.  DG> initialization and a few lines of cleanup.  If he had coded one entry 
  2549.  
  2550.  DG> and one exit, I wouldn't have wasted about 2 hours transferring a huge 
  2551.  
  2552.  DG> file over a phone line only to have the transfer fail because the 
  2553.  DG> cleanup code never executed.  Instead of adding cleanup code every 
  2554.  DG> where there was a halt, I recoded the program...
  2555.  
  2556. The problem is solved if you use exit procedures correctly.  That not only
  2557. ensures that the cleanup code is execute, regardless of where the halt or
  2558. exit is, it also ensures that it is executed in the event of a run-time error
  2559. causing a program termination.
  2560.  
  2561. TeeCee
  2562.  
  2563. --- TC-ED   v2.01  
  2564.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2565.  * Tossed by SFToss v1.00b on 92/05/08  19:35:22
  2566.  
  2567. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2568.  
  2569. Conference 4
  2570. Date       05-08-92 15:55:49
  2571. From       Trevor Carlsen
  2572. To         Damian Slee
  2573. Subject    Clearing keyboard buffer
  2574.  
  2575.  
  2576.  
  2577.  DS> A simple problem I'm sure, but does anyone know how to clear the
  2578.  DS> keyboard buffer in pascal?
  2579.  
  2580. If you are using TP6 and have the extended syntax compiler directive set {$X+}
  2581. then and are using the crt unit -
  2582.  
  2583. procedure ClearKbdBuffer;
  2584.   begin
  2585.     while Keypressed do ReadKey;
  2586.   end;
  2587.  
  2588. or if you don't have extended syntax then
  2589.  
  2590. procedure ClearKbdBuffer;
  2591.   begin
  2592.     while Keypressed do while ReadKey = #0 do;
  2593.   end;
  2594.  
  2595. or if you do not wish to use the crt unit -
  2596.  
  2597. procedure ClearKbdBuffer;
  2598.   var
  2599.     head : byte absolute $40:$1a;
  2600.     tail : byte absolute $40:$1c;
  2601.   begin
  2602.     asm cli end;
  2603.     tail := head;
  2604.     asm sti end;
  2605.   end; 
  2606.  
  2607. TeeCee
  2608.  
  2609. --- TC-ED   v2.01  
  2610.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2611.  * Tossed by SFToss v1.00b on 92/05/08  19:35:22
  2612.  
  2613. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2614.  
  2615. Conference 4
  2616. Date       05-08-92 17:35:06
  2617. From       Trevor Carlsen
  2618. To         Andrew Krywaniuk
  2619. Subject    1/4 Keyboard input unit
  2620.  
  2621.  
  2622.  
  2623.  AK> When I set a variable as an integer, and the person using my program 
  2624.  
  2625.  AK> is kind of stupid -(I ask: 'How many years old are you?', and they 
  2626.  AK> type: 'sixteen')- how can I avoid the inevitable break in the program, 
  2627.  
  2628.  AK> and replace it with my own 'please enter that on the numeric keypad, 
  2629.  
  2630.  AK> lesserlife' type message? It must be possible because those commercial 
  2631.  
  2632.  AK> programs written in pascal don't abort just because someone can't 
  2633.  AK> answer a simple question.  
  2634.  
  2635. Instead of using readln as your input method, you need to write an input routine
  2636. that gets input a keypress at a time.  This allows you to do a lot of error
  2637. checking etc...
  2638.  
  2639. Here is a unit that I posted some months back that has been modified still
  2640. further.  It contains the procedures ReadStr, ReadInteger and ReadReal that
  2641. will do what you want.  It also contains quite a few other useful things.
  2642.  
  2643. {$IFDEF Ver60}
  2644. {$A+,B-,D-,E+,F-,I-,L-,N+,O-,R-,S-,V-,X+}
  2645. {$ELSE}
  2646. {$A+,B-,D-,E+,F-,I-,L-,N+,O-,R-,S-,V-}
  2647. {$ENDIF}
  2648.  
  2649. unit keyinput;
  2650.  
  2651. { Author Trevor J Carlsen - released into the public domain 1991         }
  2652. {        PO Box 568                                                      }
  2653. {        Port Hedland                                                    }
  2654. {        Western Australia 6721                                          }
  2655. {        Voice +61 91 73 2026  Data +61 91 73 2569                       }
  2656. {        FidoNet 3:690/644                                               }
  2657.  
  2658. { This unit is designed to permit controlled input into a pre-determined }
  2659. { field size.  It also provides some handy associated procedures and     }
  2660. { functions and constants.                                               }
  2661.  
  2662. interface
  2663.  
  2664. uses crt;
  2665.  
  2666. const
  2667.   F1  = $3b00; ShF1  = $5400; CtrlF1  = $5e00; AltF1  = $6800;
  2668.   F2  = $3c00; ShF2  = $5500; CtrlF2  = $5f00; AltF2  = $6900;
  2669.   F3  = $3d00; ShF3  = $5600; CtrlF3  = $6000; AltF3  = $6a00;
  2670.   F4  = $3e00; ShF4  = $5700; CtrlF4  = $6100; AltF4  = $6b00;
  2671.   F5  = $3f00; ShF5  = $5800; CtrlF5  = $6200; AltF5  = $6c00;
  2672.   F6  = $4000; ShF6  = $5900; CtrlF6  = $6300; AltF6  = $6d00;
  2673.   F7  = $4100; ShF7  = $5a00; CtrlF7  = $6400; AltF7  = $6e00;
  2674.   F8  = $4200; ShF8  = $5b00; CtrlF8  = $6500; AltF8  = $6f00;
  2675.   F9  = $4300; ShF9  = $5c00; CtrlF9  = $6600; AltF9  = $7000;
  2676.   F10 = $4400; ShF10 = $5d00; CtrlF10 = $6700; AltF10 = $7100;
  2677.  
  2678.   BackSpace    = $0e08; CtrlBackSpace = $0e7f;
  2679.   Tab          = $0f09; Tab_left      = $0f00;
  2680.   Enter        = $1c0d; CtrlEnter     = $1c0a;
  2681.   InsertKey    = $5200; DeleteKey     = $5300;
  2682.   Home         = $4700; CtrlHome      = $7700;
  2683.   Endkey       = $4f00; CtrlEnd       = $7500;
  2684.   PageUp       = $4900; CtrlPageUp    = $8400;
  2685.   PageDn       = $5100; CtrlPageDown  = $7600;
  2686.   UpArrow      = $4800; DownArrow     = $5000;
  2687.   LeftArrow    = $4b00; CtrlLeftArrow = $7300;
  2688.   RightArrow   = $4d00; CtrlRightArrow= $7400;
  2689.   Escape       = $011b;
  2690.  
  2691. type
  2692.   Toggles      = (RightShift, LeftShift, Ctrl, Alt,
  2693.                   ScrollLock, NumLock, CapsLock, Insert);
  2694.   shiftstatus  = set of Toggles;
  2695.   CursorState  = (Off, On, Normal, Block);
  2696.   ToggleType   = Off..On;
  2697.   InputType    = (Numeric, AlphaNumeric);
  2698.  
  2699. const
  2700.   InsertOn : boolean = false;
  2701. var
  2702.   KbdStatus   : shiftstatus absolute $40:$17;
  2703.   ValidKeys: array[InputType] of set of char;
  2704.  
  2705. procedure Beep(freq,len: word);
  2706. function  CursorStatus: CursorState;
  2707. procedure Cursor(Action: CursorState);
  2708. procedure NormalCursor;
  2709. procedure HiddenCursor;
  2710. procedure BlockCursor;
  2711. procedure ClearKbdBuffer;
  2712. function  ReadStr(width   : word;
  2713.                   prompt  : string;
  2714.                   attr    : byte;
  2715.                   s       : string;
  2716.                   _Input  : InputType) : string;
  2717. function  ReadInteger(p: string; attr: byte; min,max: longint): longint;
  2718. function  ReadReal(p: string; attr: byte; min,max: longint): real;
  2719. procedure SetLock(TKey: Toggles; state: ToggleType);
  2720. function  LeftShiftPressed: boolean;
  2721. function  RightShiftPressed: boolean;
  2722. function  AltPressed: boolean;
  2723. function  CtrlPressed: boolean;
  2724.  
  2725.  
  2726.  
  2727. --- TC-ED   v2.01  
  2728.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2729.  * Tossed by SFToss v1.00b on 92/05/08  19:35:23
  2730.  
  2731. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2732.  
  2733. Conference 4
  2734. Date       05-08-92 17:35:35
  2735. From       Trevor Carlsen
  2736. To         Andrew Krywaniuk
  2737. Subject    2/4 Keyboard input unit
  2738.  
  2739.  
  2740.  
  2741. ...continued
  2742.  
  2743. implementation
  2744.  
  2745. var
  2746.   OriginalStatus : CursorState;
  2747.   OldExitProc    : pointer;
  2748.  
  2749. procedure Beep(freq,len : word);
  2750.   { Beeps the speaker for len thousandths of a second }
  2751.   begin
  2752.     Sound(freq);
  2753.     delay(len);
  2754.     NoSound;
  2755.   end;  { Beep }
  2756.  
  2757. function CursorStatus: CursorState;
  2758.   var
  2759.     bottom: byte absolute $40:$60;
  2760.     top   : byte absolute $40:$61;
  2761.     x     : shortint;
  2762.   begin
  2763.     x     := bottom - top;
  2764.     if x < 0 then
  2765.       CursorStatus := Off
  2766.     else if x = 1 then
  2767.       CursorStatus := Normal
  2768.     else if x > 1 then
  2769.       CursorStatus := Block
  2770.     else CursorStatus := On;
  2771.   end;  { CursorStatus }
  2772.  
  2773. procedure Cursor(Action : CursorState);
  2774.   { Turn the cursor on/off or make it a block}
  2775.  
  2776.   procedure ChangeCursor(top,bottom : byte);
  2777.     begin
  2778.       asm
  2779.         mov ah, $01
  2780.         mov ch, top
  2781.         mov cl, bottom
  2782.         int $10
  2783.       end;
  2784.     end; { ChangeCursor}
  2785.  
  2786. begin
  2787.   case action of
  2788.     On     : if LastMode = Mono then
  2789.                  ChangeCursor($0C,$0C)
  2790.                else
  2791.                  ChangeCursor($06,$06);
  2792.     Normal : if LastMode = Mono then
  2793.                ChangeCursor($0B,$0C)
  2794.              else
  2795.                ChangeCursor($06,$07);
  2796.     Off    : ChangeCursor($20,$00);
  2797.     Block  : if LastMode = Mono then
  2798.                ChangeCursor($02,$0C)
  2799.              else
  2800.                ChangeCursor($02,$07);
  2801.   end; { case}
  2802. end;  { ChangeCursor}
  2803.  
  2804. procedure NormalCursor;
  2805.   begin
  2806.     Cursor(On);
  2807.   end; { NormalCursor }
  2808.  
  2809. procedure HiddenCursor;
  2810.   begin
  2811.     Cursor(Off);
  2812.   end; { HiddenCursor }
  2813.  
  2814. procedure BlockCursor;
  2815.   begin
  2816.     Cursor(Block);
  2817.   end;  { BlockCursor }
  2818.  
  2819. procedure ClearKbdBuffer;
  2820.   begin
  2821.     {$IFDEF Ver60}
  2822.     while Keypressed do ReadKey;
  2823.     {$ELSE}
  2824.     while KeyPressed do while ReadKey = #0 do;
  2825.     {$ENDIF}
  2826.   end;
  2827.  
  2828. function KeyWord : word; assembler;
  2829.   { Returns a word value where the msb is the scan code of a keypress    }
  2830.   { and the lsb is the asciiz value of the key.                          }
  2831.   asm
  2832.     mov  ax,0
  2833.     int  16h
  2834.   end;  { KeyWord }
  2835.  
  2836.  
  2837.  
  2838. --- TC-ED   v2.01  
  2839.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2840.  * Tossed by SFToss v1.00b on 92/05/08  19:35:23
  2841.  
  2842. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2843.  
  2844. Conference 4
  2845. Date       05-08-92 17:36:07
  2846. From       Trevor Carlsen
  2847. To         Andrew Krywaniuk
  2848. Subject    3/4 Keyboard input unit
  2849.  
  2850.  
  2851.  
  2852. function  ReadStr(width   : word;
  2853.                   prompt  : string;
  2854.                   attr    : byte;
  2855.                   s       : string;
  2856.                   _Input  : InputType) : string;
  2857.  
  2858. {   Editing keys are -                                                   }
  2859. {     DeleteKey        - DeleteKeys character at the cursor.             }
  2860. {     LeftArrow        - Nondestructive move cursor to the left.         }
  2861. {     RightArrow       - Nondestructive move cursor to the right.        }
  2862. {     End              - Move cursor to end of input string.             }
  2863. {     Home             - Move cursor to start of input string.           }
  2864. {     Backspace        - DeleteKeys character to the left of cursor.     }
  2865. {     escape           - Aborts routine which then returns just an       }
  2866. {                        escape character - regardless of what           }
  2867. {                        characters were previously entered.             }
  2868. {     return/enter     - Leaves routine with string returned.            }
  2869.  
  2870. {   Width = The width of the input field.  Once input reaches the width  }
  2871. {           required, no further characters are accepted.                }
  2872. {   prompt= A prompt will be displayed in the current attribute.  If no  }
  2873. {           prompt is required pass a nul string.                        }
  2874. {   attr  = The input field will be displayed in attr colour.            }
  2875. {   s     = s will be displayed in the input field and the cursor will   }
  2876. {           be positioned at the end of the s string.                    }
  2877.  
  2878. {   Example:                                                             }
  2879. {      st := ReadStr(20,'Enter Name: ',LtGrayOnBlue,st);                 }
  2880. {      ( st MUST be initialised in the above example before the call. )  }
  2881.  
  2882. const
  2883.     space = #32;
  2884. var
  2885.   xpos, ypos,
  2886.   stpos,OldAttr : byte;
  2887.   len           : byte absolute s;
  2888.   finished      : boolean;
  2889.   key           : word;
  2890.   ch            : char absolute key;
  2891.  
  2892.  
  2893.   procedure WriteField;
  2894.     var x : byte;
  2895.     begin
  2896.       GotoXY(xpos,ypos);
  2897.       for x := 1 to width do
  2898.         write(space);
  2899.       GotoXY(xpos,ypos);
  2900.     end; { WriteField }
  2901.  
  2902.   procedure DeleteChar;
  2903.     begin
  2904.       Delete(s,stpos,1);
  2905.       s := s + space;
  2906.       gotoXY(xpos,ypos);
  2907.       write(s);
  2908.       dec(len);
  2909.     end;  { DeleteChar }
  2910.  
  2911.   procedure AddChar;
  2912.     { Checks that it is valid to insert or add a character to input str }
  2913.     begin
  2914.       if InsertOn then begin
  2915.         if (len < width) then begin
  2916.           move(s[stpos],s[succ(stpos)],width-pred(stpos));
  2917.           inc(len);
  2918.           s[stpos] := ch;
  2919.           inc(stpos);
  2920.         end
  2921.         else beep(450,15);
  2922.       end else begin
  2923.         if stpos <= width then begin
  2924.           s[stpos] := ch;
  2925.           if stpos > len then
  2926.             inc(len);
  2927.           inc(stpos);
  2928.         end else beep(450,15);
  2929.       end;
  2930.     end; { AddChar }
  2931.  
  2932.   begin
  2933.     finished      := false;
  2934.     OldAttr       := TextAttr;
  2935.     write(prompt);
  2936.     TextAttr      := attr;
  2937.     xpos          := WhereX;
  2938.     ypos          := WhereY;
  2939.     WriteField;
  2940.     stpos         := succ(len);
  2941.     repeat
  2942.       GotoXY(xpos,ypos);
  2943.       write(s);
  2944.       GotoXY(xpos + pred(stpos),ypos);
  2945.       if InsertOn then
  2946.         Cursor(Block)
  2947.       else
  2948.         Cursor(Normal);
  2949.       key := KeyWord;
  2950.       case key of
  2951.         InsertKey  : InsertOn := not InsertOn;
  2952.         DeleteKey  : if (len > 0) and (stpos > 0) then
  2953.                        DeleteChar;
  2954.         Enter      : begin
  2955.                        ReadStr  := s;
  2956.                        finished := true;
  2957.                      end;
  2958.         BackSpace  : if stpos > 1 then begin
  2959.                        dec(stpos);
  2960.                        DeleteChar;
  2961.                      end
  2962.                      else beep(450,15);
  2963.         Escape     : begin
  2964.                        finished := true;
  2965.                        ReadStr  := ch;
  2966.                        WriteField;
  2967.                        len      := 0;
  2968.                      end;
  2969.         LeftArrow  : if stpos > 1 then dec(stpos);
  2970.         RightArrow : if stpos <= len then inc(stpos);
  2971.         Home       : stpos := 1;
  2972.         EndKey     : stpos := succ(len);
  2973.         else
  2974.           if char(lo(key)) in ValidKeys[_Input] then
  2975.             AddChar
  2976.           else beep(450,15);
  2977.       end; { case key of }
  2978.     until finished;
  2979.     TextAttr      := OldAttr;
  2980.     writeln;
  2981.   end; { ReadStr }
  2982.  
  2983.  
  2984.  
  2985. --- TC-ED   v2.01  
  2986.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  2987.  * Tossed by SFToss v1.00b on 92/05/08  19:35:23
  2988.  
  2989. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  2990.  
  2991. Conference 4
  2992. Date       05-08-92 17:36:39
  2993. From       Trevor Carlsen
  2994. To         Andrew Krywaniuk
  2995. Subject    4/4 Keyboard input unit
  2996.  
  2997.  
  2998.  
  2999. function ReadInteger(p: string; attr: byte; min,max: longint): longint;
  3000.   { Prompts for input and converts that input to a longint.  If number }
  3001.   { entered is less than min or greater than max, will report an error }
  3002.   { and request re-entry of the data.                                  }
  3003.   { Example:                                                           }
  3004.   { long := ReadInteger('Enter number between 10 and 100: ',           }
  3005.   {                      WhiteOnBlue,10,100);                          }
  3006.   var
  3007.     temp     : longint;
  3008.     code     : integer;
  3009.     finished : boolean;
  3010.     st       : string;
  3011.   begin
  3012.     if min >= 0 then
  3013.       ValidKeys[Numeric] := ['0'..'9']
  3014.     else
  3015.       ValidKeys[Numeric] := ['0'..'9','-'];
  3016.     repeat
  3017.       st := ReadStr(11,p,attr,'',Numeric);
  3018.       val(st,temp,code);
  3019.       finished := (code = 0) and (temp >= min) and (temp <= max);
  3020.       if not finished then
  3021.         writeln('Error - redo')
  3022.       else
  3023.         ReadInteger := temp;
  3024.     until finished;
  3025.   end;  { ReadInteger }
  3026.  
  3027. function ReadReal(p: string; attr: byte; min,max: longint): real;
  3028.   { Prompts for input and converts that input to a real.  If number    }
  3029.   { entered is less than min or greater than max, will report an error }
  3030.   { and request re-entry of the data.                                  }
  3031.   { Example:                                                           }
  3032.   { R := ReadReal('Enter number between 10 and 100: ',                 }
  3033.   {                      WhiteOnBlue,10,100);                          }
  3034.  
  3035.   var
  3036.     temp     : real;
  3037.     code     : integer;
  3038.     finished : boolean;
  3039.     st       : string;
  3040.   begin
  3041.     if min >= 0 then
  3042.       ValidKeys[Numeric] := ['0'..'9','.']
  3043.     else
  3044.       ValidKeys[Numeric] := ['0'..'9','-','.'];
  3045.     repeat
  3046.       st := ReadStr(11,p,attr,'',Numeric);
  3047.       val(st,temp,code);
  3048.       finished := (code = 0) and (temp >= min) and (temp <= max);
  3049.       if not finished then
  3050.         writeln('Error - redo')
  3051.       else
  3052.         ReadReal := temp;
  3053.     until finished;
  3054.   end;  { ReadReal }
  3055.  
  3056. procedure SetLock(TKey: Toggles; state: ToggleType);
  3057.   begin
  3058.     case TKey of
  3059.     CapsLock  : if state = On then
  3060.                   KbdStatus := KbdStatus + [CapsLock]
  3061.                 else
  3062.                   KbdStatus := KbdStatus - [CapsLock];
  3063.     NumLock  : if state = On then
  3064.                   KbdStatus := KbdStatus + [NumLock]
  3065.                 else
  3066.                   KbdStatus := KbdStatus - [NumLock];
  3067.     ScrollLock: if state = On then
  3068.                   KbdStatus := KbdStatus + [ScrollLock]
  3069.                 else
  3070.                   KbdStatus := KbdStatus - [ScrollLock];
  3071.     end; { case }
  3072.   end;
  3073.  
  3074. function  LeftShiftPressed: boolean;
  3075.   begin
  3076.     LeftShiftPressed := LeftShift in KbdStatus;
  3077.   end;
  3078.  
  3079. function  RightShiftPressed: boolean;
  3080.   begin
  3081.     RightShiftPressed := RightShift in KbdStatus;
  3082.   end;
  3083.  
  3084. function  AltPressed: boolean;
  3085.   begin
  3086.     AltPressed := Alt in KbdStatus;
  3087.   end;
  3088.  
  3089. function  CtrlPressed: boolean;
  3090.   begin
  3091.     CtrlPressed := Ctrl in KbdStatus;
  3092.   end;
  3093.  
  3094. procedure KbdExitProc; far;
  3095.   begin
  3096.     ExitProc := OldExitProc;
  3097.     Cursor(OriginalStatus);
  3098.   end;  { KbdExitProc }
  3099.  
  3100. begin
  3101.   ValidKeys[AlphaNumeric] := [#0..#255];
  3102.   { Set up an exit procedure to ensure that the cursor is restored }
  3103.   OldExitProc    := ExitProc;
  3104.   OriginalStatus := CursorStatus;
  3105. end.
  3106.  
  3107.  
  3108.  
  3109. --- TC-ED   v2.01  
  3110.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3111.  * Tossed by SFToss v1.00b on 92/05/08  19:35:23
  3112.  
  3113. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3114.  
  3115. Conference 4
  3116. Date       05-08-92 19:48:00
  3117. From       Trevor Carlsen
  3118. To         Vince Laurent
  3119. Subject    Setting the CAPS lock on.
  3120.  
  3121.  
  3122.  
  3123.  VL> I am trying to write a program that will toggle the CAPS key on. The
  3124.  VL> reason I am doing this is because our new mainframe works ONLY WITH
  3125.  VL> UPPERCASE LETTERS and I am growing old/tired of answering calls that 
  3126.  
  3127.  VL> end with the reply 'Is your CAPS lock on?'.
  3128.  
  3129. See the Keyinput unit posted today for a procedure that will do this for you.
  3130.  
  3131. TeeCee
  3132.  
  3133. --- TC-ED   v2.01  
  3134.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3135.  * Tossed by SFToss v1.00b on 92/05/08  19:35:23
  3136.  
  3137. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3138.  
  3139. Conference 4
  3140. Date       05-09-92 04:53:16
  3141. From       Trevor Carlsen
  3142. To         Stephane Michaud
  3143. Subject    Procedures
  3144.  
  3145.  
  3146.  
  3147.  SM> I'm writing a large program and I need to call lots of
  3148.  SM> procedures.  As soon as one boolean var changes to false, i
  3149.  SM> need to close them all except the main procedure.  Is
  3150.  SM> they're a better way to do this in Turbo Pascal 6.0 then
  3151.  SM> using the exit (I hate that word) command?
  3152.  
  3153. Firstly, there are no such things as commands in Pascal.  There are functions,
  3154. procedures, statements, declarations and data. The exit procedure is also
  3155. of little use to you in the above context as all it does is cause an immediate
  3156. departure from the current procedure.
  3157.  
  3158. Here is an unit that may help but I advocate caution in its use.  Normally
  3159. a need for such practice would indicate poor design and/or understanding of
  3160. good programming practices.
  3161.  
  3162. unit LongJump;
  3163.  
  3164. { This unit permits a long jump from deeply nested procedures/functions back }
  3165.  
  3166. { to a predetermined starting point.                                         }
  3167.  
  3168.  
  3169. { Whilst the purists may shudder at such a practice there are times when such}
  3170. { an ability can be exceedingly useful.  An example of such a time is in a   }
  3171.  
  3172. { BBS program when the carrier may be lost unexpectedly whilst a user is on  }
  3173.  
  3174. { line and the requirement is to "back out" to the initialisation reoutines  }
  3175.  
  3176. { at the start of the program.                                               }
  3177.  
  3178.  
  3179. { To use the facility, it is required that a call be made to the SetJump     }
  3180.  
  3181. { function at the point to where you wish the execution to resume after a    }
  3182.  
  3183. { long jump. When the time comes to return to that point call FarJump.       }
  3184.  
  3185.  
  3186. { If you are an inexperienced programmer, I do not recommend that this unit  }
  3187.  
  3188. { be used for other than experimentation.  Usually there are better ways to  }
  3189.  
  3190. { achieve what you want to do by proper planning and structuring.  It is     }
  3191.  
  3192. { rare to find a well written program that will need such and ability.       }
  3193.  
  3194.  
  3195. interface
  3196.  
  3197. const
  3198.   normal = -1;                         { return was not from a LongJump call }
  3199.  
  3200. type
  3201.   jumptype = record                        { the data need for a return jump }
  3202.  
  3203.                 bp,sp,cs,ip : word;
  3204.              end;
  3205.  
  3206. function  SetJump(var JumpData : jumptype): integer;
  3207. procedure FarJump(JumpData : jumptype; IDInfo : integer);
  3208.  
  3209. implementation
  3210.  
  3211. type
  3212.   WordPtr = ^word;
  3213.  
  3214. function SetJump(var JumpData : jumptype): integer;
  3215.   begin                     { store the return address (the old bp register) }
  3216.  
  3217.     JumpData.bp := WordPtr(ptr(SSeg,SPtr+2))^;
  3218.     JumpData.ip := WordPtr(ptr(SSeg,SPtr+4))^;
  3219.     JumpData.cs := WordPtr(ptr(SSeg,SPtr+6))^;
  3220.     JumpData.SP := SPtr;
  3221.     SetJump := normal;                { show that this is not a FarJump call }
  3222.  
  3223.   end;  { SetJump }
  3224.  
  3225. procedure FarJump(JumpData : jumptype; IDInfo : integer );
  3226.   begin
  3227.     { change the return address of the calling routine of the stack so that  }
  3228.  
  3229.     { a return can be made to the caller of SetJump                          }
  3230.  
  3231.     { Use IDInfo as an identifier of the routine the jump occurred from      }
  3232.  
  3233.     with JumpData do begin
  3234.       WordPtr(ptr(SSeg,sp))^   := bp;
  3235.       WordPtr(ptr(SSeg,sp+2))^ := ip;
  3236.       WordPtr(ptr(SSeg,sp+4))^ := cs;
  3237.     end; { with }
  3238.     inline($8b/$46/$06);                                     { mov ax,[bp+6] }
  3239.  
  3240.     inline($8b/$ae/$fa/$ff);                                 { mov bp,[bp-6] }
  3241.  
  3242.   end;  { FarJump }
  3243.  
  3244. end.  { Unit LongJump }
  3245.  
  3246.  
  3247.  
  3248.  
  3249. --- TC-ED   v2.01  
  3250.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3251.  * Tossed by SFToss v1.00b on 92/05/09  17:14:41
  3252.  
  3253. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3254.  
  3255. Conference 4
  3256. Date       05-09-92 04:41:22
  3257. From       Trevor Carlsen
  3258. To         John Bean
  3259. Subject    Stacker, SpeedStor, DoubleDisk
  3260.  
  3261.  
  3262.  
  3263.  JB> The problem I am having is with the DiskFree function of turbo pascal. 
  3264.  
  3265.  
  3266.  JB>  * Origin: The Buffer Board (1:152/2.0)
  3267.  JB>  * Origin: P A S C A L  A L L E Y (1:343/52)
  3268.  JB>  * Origin: Mountain Retreat  *  Felton Ca  *  408-335-4595 (1:216/506)
  3269.  
  3270. John I cannot help you with your problem.  However, I want to clear up any
  3271. misunderstanding you may have about echomail.
  3272.  
  3273. Any message posted on a BBS in an echomail conference, is automatically "echoed"
  3274. to all other BBSs who take that conference.  In the case of the Pascal echo
  3275. this means that your message is seen by every reader of the Pascal echo at
  3276. hundreds of BBSs all over the world.
  3277.  
  3278. Your posting of virtually identical messages requesting help on the three
  3279. boards above is therefore "overkill". :-)  Just the one message should be
  3280. sufficient to get your plea for help to many BBSs worldwide.
  3281.  
  3282. Trevor Carlsen
  3283. Moderator.
  3284.  
  3285. --- TC-ED   v2.01  
  3286.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3287.  * Tossed by SFToss v1.00b on 92/05/09  17:14:41
  3288.  
  3289. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3290.  
  3291. Conference 4
  3292. Date       05-09-92 15:22:18
  3293. From       Trevor Carlsen
  3294. To         Damian Slee
  3295. Subject    TSR Clock
  3296.  
  3297.  
  3298.  
  3299.  DS>   I'm trying to write a TSR clock, though whenever Dos call made while
  3300.  DS> this is active, will cause the computer to lock up.  Any improvements
  3301.  DS> to the following would be appreciated.
  3302.  
  3303. You are making DOS calls from within your interrupt.  This is a no-no as DOS
  3304. is not re-entrant.
  3305.  
  3306.  DS> Procedure ResidentClock; Interrupt;
  3307.  DS>   Var
  3308.  DS>     Hour,Minute,Sec,Sec100:Word;
  3309.  DS>     OldX,OldY:Byte;
  3310.  DS>   Begin
  3311.  DS>     If Ticks=18 Then
  3312.  DS>       Begin
  3313.  DS>         GetTime(Hour,Minute,Sec,Sec100);         <-------- Uses DOS
  3314.  DS>          OldX:=WhereX;                           <-------- Uses DOS
  3315.  DS>           OldY:=WhereY;                          <-------- Uses DOS
  3316.  DS>            GotoXY(70,1);                         <-------- Uses DOS
  3317.  DS>           Write(Hour:2,':',Minute:2,':',Sec:2);  <-------- Uses DOS
  3318.  DS>          GotoXY(OldX,OldY);                      <-------- Uses DOS
  3319.  DS>         Ticks:=0;
  3320.  DS>       End;  {End 18 ticks}
  3321.  DS>     Ticks:=Ticks+1;
  3322.  DS>     TimerIntVec;
  3323.  DS>   End;
  3324.  DS> {$F-}
  3325.  
  3326. Try the following -
  3327.  
  3328. {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
  3329. {$M 1024,0,0}
  3330. uses dos,
  3331.      clock;  { My clock ISR unit in next message. }
  3332. const
  3333.   IDStr : string[13] = 'TeeCee''s Clock';
  3334. var
  3335.   p : pointer;
  3336. begin
  3337.   GetIntVec($66,p); { Int 66h is reserved for user defined interrupts }
  3338.   if string(p^) = IDStr then begin
  3339.     writeln('TeeCee''s clock is already installed - you must be blind!');
  3340.     halt;
  3341.   end
  3342.   else begin
  3343.     writeln('TeeCee''s clock is now installed for demo purposes only');
  3344.     SetIntVec($66,@IDStr); { IDStr is obviously not an interrupt!      }
  3345.     { What we are actually doing is storing a pointer to the IDStr     }
  3346.     { in the vector table - much like the way the Video font addresses }
  3347.     { are stored.                                                      }
  3348.     SwapVectors;
  3349.     Keep(0);
  3350.   end;
  3351. end.
  3352.  
  3353. (See the next message for the unit Clock. )
  3354.  
  3355. Now that is definitely for demonstration purposes only!  It will work but
  3356. has several serious shortcomings!
  3357.  
  3358. Firstly, it hooks the user defined interrupt $66 to allow any subsequent executi
  3359. ns to determine if the program is already installed.  It does this without
  3360. making any checks as to whether or not something else already "owns" this
  3361. vector. Not very smart!
  3362.  
  3363. Secondly, it provides no means to uninstall itself.  Mmmmm...  :-(
  3364.  
  3365. Thirdly, graphics mode will cause problems.  Again - not terribly smart!
  3366.  
  3367. Finally, TSRs are not for the faint-of-heart or beginner. They are an extraordin
  3368. rily complex and difficult part of DOS programming and if you are serious
  3369. about getting into TSRs then get as many good books as you can find that authori
  3370. ively discuss the subject.  Buying a good commercial toolbox, such as Turbo
  3371. Power's "TSRs Made Easy" is another smart move, as studying how the masters
  3372. do it is one of the best ways to learn.
  3373.  
  3374.  
  3375. TeeCee
  3376.  
  3377. --- TC-ED   v2.01  
  3378.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3379.  * Tossed by SFToss v1.00b on 92/05/09  17:14:41
  3380.  
  3381. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  3382.  
  3383. Conference 4
  3384. Date       05-09-92 07:23:27
  3385. From       Trevor Carlsen
  3386. To         Damian Slee
  3387. Subject    TSR Clock
  3388.  
  3389.  
  3390.  
  3391. unit Clock;
  3392. {
  3393.   Author:  Trevor J Carlsen 
  3394.   Purpose: Demonstrate a simple "on screen" clock.
  3395.   
  3396.   This demo unit works by "hooking" the timer interrupt ($1c). This
  3397.   interrupt is called by the hardware interrupt ($08) approximately 18.2
  3398.   times every second and normally consists of a simple return instruction
  3399.   unless some other application has already hooked it.
  3400.   
  3401.   Because the routine is called roughly 18 times every second it is
  3402.   important that any processing it contains is optimised as much as
  3403.   possible.  Obviously the best way to do this is by assembly language but
  3404.   in this demo I have used almost pure Turbo Pascal and have set up a
  3405.   counter variable and any processing is only done every 6 calls.  This is
  3406.   more than sufficient and minimises processing. The routine is by no
  3407.   means perfect - there will be a minor irregularity for the final 10
  3408.   seconds of each day and for about half a second each hour. Better this
  3409.   than to waste valuable processing time in the interrupt by coding it
  3410.   out.
  3411.   
  3412.   Because DOS is not re-entrant it is also important that the routine make
  3413.   no calls to any procedure or function that makes use of dos for its
  3414.   operation. Thus no writeln, write can be used.  To display the time on
  3415.   screen an array is addressed directly to screen memory.  Any changes in
  3416.   this array are thus reflected on the screen.  The downside to this is
  3417.   that on older CGAs this would cause a "snow" effect and code would be
  3418.   needed to eliminate this. It also means that the TP procedure GetTime
  3419.   cannot be used.  So the time is calculated from the value stored at the
  3420.   clock tick counter location.
  3421.   
  3422.   To display an on-screen clock all that is required is for a programmer
  3423.   to include this unit in the uses declaration of the program.}
  3424.   
  3425. interface
  3426.  
  3427. const
  3428.   DisplayClock : boolean = true;
  3429.  
  3430. implementation
  3431. { Everything is private to this unit }
  3432.  
  3433. uses dos;
  3434.  
  3435. const
  3436.   line          = 0;  { Change as required for position of display on screen }
  3437.  
  3438.   column        = 0;                                { Top left corner is 0,0 }
  3439.  
  3440.   ScreenPos     = (line * 160) + (column * 2);
  3441.   Colour        = $1f;                                       { White on Blue }
  3442.  
  3443.   ZeroChar      = Colour shl 8 + ord('0'); 
  3444.   Colon         = Colour shl 8 + ord(':');
  3445. type
  3446.   timestr       = array[0..7] of word;
  3447.   timeptr       = ^timestr;
  3448. var
  3449.   time          : timeptr;
  3450.   OldInt1c      : pointer;
  3451.   ExitSave      : pointer;
  3452.  
  3453. {$F+}
  3454.  procedure Int1cISR; interrupt;
  3455.   { This will be called every clock tick by hardware interrupt $08 }
  3456.   const
  3457.     count       : integer = 0;                  { To keep track of our calls }
  3458.  
  3459.   var
  3460.     hr          : word absolute $40:$6e;
  3461.     ticks       : word absolute $40:$6c; 
  3462.                   { This location keeps the number of clock ticks since 00:00}
  3463.     min,
  3464.     sec         : byte;
  3465.     seconds     : word;
  3466.   begin
  3467.     asm cli end;
  3468.     if DisplayClock then begin
  3469.       inc(count);
  3470.       if count = 6 then { ticks to update the display } begin
  3471.         count       := 0;    { equality check and assignment faster than mod }
  3472.  
  3473.         seconds     := ticks * longint(10) div 182;       { speed = no reals }
  3474.  
  3475.         min         := (seconds div 60) mod 60;
  3476.         sec         := seconds mod 60;
  3477.  
  3478.       { The following statements are what actually display the on-screen time}
  3479.  
  3480.         time^[0]    := ZeroChar + (hr div 10);         { first char of hours }
  3481.  
  3482.         time^[1]    := ZeroChar + (hr mod 10);        { second char of hours }
  3483.  
  3484.         time^[2]    := Colon;
  3485.         time^[3]    := ZeroChar + (min div 10);      { first char of minutes }
  3486.  
  3487.         time^[4]    := ZeroChar + (min mod 10);     { second char of minutes }
  3488.  
  3489.         time^[5]    := Colon;
  3490.         time^[6]    := ZeroChar + (sec div 10);      { first char of seconds }
  3491.  
  3492.         time^[7]    := ZeroChar + (sec mod 10);     { second char of seconds }
  3493.  
  3494.       end;  { if count = 6 }
  3495.     end;  { if DisplayClock }
  3496.     asm         
  3497.       sti
  3498.       pushf                                  { push flags to set up for IRET }
  3499.  
  3500.       call OldInt1c;                              { Call old ISR entry point }
  3501.  
  3502.     end;
  3503.   end; { Int1cISR }
  3504.  
  3505. procedure ClockExitProc;
  3506.   { This procedure is VERY important as you have hooked the timer interrupt  }
  3507.  
  3508.   { and therefore if this is omitted when the unit is terminated your        }
  3509.  
  3510.   { system will crash in an unpredictable and possibly damaging way.         }
  3511.  
  3512.   begin
  3513.     ExitProc := ExitSave;
  3514.     SetIntVec($1c,OldInt1c);               { This "unhooks" the timer vector }
  3515.  
  3516.   end;
  3517. {$F-}
  3518.  
  3519. procedure Initialise;
  3520.   var
  3521.     mode : byte absolute $40:$49;
  3522.   begin
  3523.     if mode = 7 then                                { must be a mono adaptor }
  3524.  
  3525.       time := ptr($b000,ScreenPos)
  3526.     else                                       { colour adaptor of some kind }
  3527.  
  3528.       time := ptr($b800,ScreenPos);      
  3529.     GetIntVec($1c,OldInt1c);              { Get old timer vector and save it }
  3530.  
  3531.     ExitSave := ExitProc;                          { Save old exit procedure }
  3532.  
  3533.     ExitProc := @ClockExitProc;                 { Setup a new exit procedure }
  3534.  
  3535.     SetIntVec($1c,@Int1cISR);   { Hook the timer vector to the new procedure }
  3536.  
  3537.   end;  { Initialise }  
  3538.   
  3539. begin 
  3540.   Initialise;
  3541. end.
  3542.  
  3543.  
  3544.  
  3545. --- TC-ED   v2.01  
  3546.  * Origin: The Pilbara's Pascal Centre (+61 91 732930) (3:690/644)
  3547.  * Tossed by SFToss v1.00b on 92/05/09  17:14:42
  3548.